2011-05-04 11 views
5

का उपयोग कर संसाधन से लोड होने पर PNGImage मुखौटा को कैसे संरक्षित किया जाए, मैं अपना कोड डेल्फी एक्सई (डेल्फी 7 से) में अपग्रेड कर रहा हूं और सभी अनावश्यक पुस्तकालयों को खत्म करने की कोशिश कर रहा हूं। मैंने उम्र के लिए पीएनजी कॉम्पोनेंट्स का उपयोग किया है, लेकिन यह समय पर जाने और मूल TImageList और TPNGImage का उपयोग करने का समय है।डेल्फी एक्सई

मेरे कोड का हिस्सा संसाधनों से जुड़े रनटाइम पर एक छवि सूची लोड करता है। इस के लिए मेरे काम कर PNGComponents कोड है:

function CreateAndLoadImageList(ASize : integer) : TPngImageList; 
var 
    PngObject : TPngObject; 
    I : integer; 
begin 
    Result := TPngImageList.Create(nil); 

    Result.BeginUpdate; 
    try 

    Result.Width := ASize; 
    Result.Height := ASize; 

    PngObject := TPngObject.create; 
    try 

     For I := 0 to Length(ArtImageNames) -1 do 
     begin 
     PngObject.LoadFromResourceName(hInstance, Format('AImg%d_%d', [ASize, I])); 

     Result.PngImages.Add(False).PngImage := PngObject; 
     end; 

    finally 
     PngObject.Free; 
    end; 


    finally 
    Result.EndUpdate; 
    end; 

end; 

मैं अब कोड कोशिश कर रहा हूँ this question में एक जवाब का उपयोग करना है, जो नीचे चित्र भी दिखाता है, लेकिन काली पृष्ठभूमि के साथ, शायद क्योंकि मुखौटा खो दिया है। मुझे लगता है कि मुझे ImageList_ पास करने के लिए एक मुखौटा बिटमैप चाहिए जहां '0' है लेकिन मैं इस सामान पर खराब हूं। क्या किसी को पता है कि मैं यह कैसे काम कर सकता हूं?

function CreateAndLoadImageList(ASize : integer) : TImageList; 
var 
    PngImage : TPngImage; 
    bmp : TBitmap; 
    I : integer; 
begin 

    Result := TImageList.Create(nil); 
    Result.Masked := False; 
    Result.DrawingStyle := dsTransparent; 

    Result.BeginUpdate; 
    try 

    Result.Width := ASize; 
    Result.Height := ASize; 
    Result.Masked := False; 

    PngImage := TPngImage.create; 
    try 

     For I := 0 to Length(ArtImageNames) -1 do 
     begin 
     PngImage.LoadFromResourceName(hInstance, Format('AImg%d_%d', [ASize, I])); 


     bmp:=TBitmap.Create; 
     PngImage.AssignTo(bmp); 

     bmp.AlphaFormat:=afIgnored; 

     ImageList_Add(Result.Handle, bmp.Handle, 0); 
     Bmp.Free; 

     end; 
    finally 
     PngImage.Free; 
    end; 


    finally 
    Result.EndUpdate; 
    end; 

end; 

उत्तर

2

PNG छवियाँ अल्फा चैनल का उपयोग आंशिक पारदर्शिता है। वे मास्क का उपयोग नहीं करते हैं। मुझे कल्पना है कि आपकी समस्या यह है कि आप अपनी छवि सूची में अल्फा को बनाए नहीं रख रहे हैं।

  • आप स्थापित करना चाहिए अपनी छवि सूची के ColorDepthcd32Bit करने के लिए।
  • मैं उम्मीद करता हूं कि जब आप अपनी पीएनजी छवि को असाइन करते हैं तो बिटमैप की गुणों को सही ढंग से सेट करने की उम्मीद है ताकि अल्फाफॉर्मैट सेट करने वाली रेखा को हटा दें।

एक तरफ के रूप में इसका उद्देश्य यह है कि आप के बजाय Assign का उपयोग करें। AssignTo एक आंतरिक विधि है जो TPersistent के लिए डबल प्रेषण का हल्का रूप सक्षम करती है।

+0

सीडी 32 बिट के लिए कलरडेप ने इसे किया। बहुत बहुत धन्यवाद। –

संबंधित मुद्दे