2010-11-19 6 views
8

का उपयोग कर रनटाइम में एक इमेजलिस्ट में एक पीएनजी छवि जोड़ें, मुझे TImageList पर रनटाइम में एक पीएनजी छवि जोड़ने की आवश्यकता है। मैं TCustomImageList द्वारा कार्यान्वित कार्यों को देखा है, लेकिन वे केवल एक और ImageList सेडेल्फी XE

  • बिटमैप्स,
  • चिह्न या
  • छवियों जोड़ने की अनुमति

उदाहरण के लिए:

function Add(Image, Mask: TBitmap): Integer; 
function AddIcon(Image: TIcon): Integer; 
function AddImage(Value: TCustomImageList; Index: Integer): Integer; 
procedure AddImages(Value: TCustomImageList); 
function AddMasked(Image: TBitmap; MaskColor: TColor): Integer; 

मैं इस छवि को बीएमपी में परिवर्तित किए बिना एक छवि सूची घटक में एक पीएनजी छवि कैसे जोड़ सकता हूं?

आईडीई पहले से ही डिजाइन समय में कोई ImageList के लिए एक PNG जोड़ सकते हैं:

enter image description here

अब हम कार्यावधि में यह करने के लिए की जरूरत है।

उत्तर

3

एमएसडीएन के मुताबिक एक इमेजलिस्ट में केवल बिटमैप और आइकन हो सकते हैं। एक इमेजलिस्ट में एक पीएनजी छवि जोड़ने के लिए आपको इसे पहले एक आइकन में परिवर्तित करना होगा। ऐसा करने के लिए कोड PngComponents पैकेज में पाया जा सकता है। अगर आपके पास अपनी कल्पनावादी में केवल पीएनजी छवियां हैं, तो आप सादगी के लिए बस उस पैकेज के साथ आने वाले TPngImageList का उपयोग कर सकते हैं।

1
  • TPngImage, PngImage का एक उदाहरण बनाएँ: PngImage
  • लोड इस उदाहरण में छवि, PngImage.LoadFromFile (..)
  • TBitmap, बिटमैप का एक उदाहरण बनाएँ: TBitmap
  • पीएनजी निरुपित बिटमैप के लिए, बिटमैप। एस्साइन (PngImage)
  • छवि सूची में बिटमैप जोड़ें
  • काम किया गया!
16

डेल्फी एक्सई में अल्फा चैनल के साथ पीएनजी छवियों और 32-बिट बिटमैप्स को संभालने के लिए सभी समर्थन हैं।

var pngbmp: TPngImage; 
    bmp: TBitmap; 
    ImageList: TImageList; 
begin 
    ImageList:=TImageList.Create(Self); 
    ImageList.Masked:=false; 
    ImageList.ColorDepth:=cd32bit; 
    pngbmp:=TPNGImage.Create; 
    pngbmp.LoadFromFile('test.png'); 
    bmp:=TBitmap.Create; 
    pngbmp.AssignTo(bmp); 
    // ==================================================== 
    // Important or else it gets alpha blended into the list! After Assign 
    // AlphaFormat is afDefined which is OK if you want to draw 32 bit bmp 
    // with alpha blending on a canvas but not OK if you put it into 
    // ImageList -- it will be way too dark! 
    // ==================================================== 
    bmp.AlphaFormat:=afIgnored; 
    ImageList_Add(ImageList.Handle, bmp.Handle, 0); 

आप में शामिल करना चाहिए

ImgList, PngImage

अब आप का प्रयास करें:

Pngbmp.Draw(Bmp1.Canvas,Rect); 
and 
    ImageList.Draw(Bmp1.Canvas,0,0,0,true); 

आपको लगता है कि चित्र दिखाई देंगे यहाँ कोई ImageList को png जोड़ने के बारे में है समान हैं। दरअसल, अल्फा ब्लेंडिंग के दौरान गोलाकार त्रुटियों के कारण कुछ \ pm 1 आरजीबी मतभेद हैं लेकिन आप उन्हें नग्न आंखों से नहीं देख सकते हैं। bmp.AlphaFormat सेट करने के लिए उपेक्षा: = अनदेखा; परिणामस्वरूप दूसरी छवि बहुत गहरा हो जाएगी!

सादर,

एलेक्स

+0

रखो CommCtrl खंड का उपयोग करता है करने के लिए ImageList_Add() उपलब्ध बनाने के लिए। – denim