2009-02-10 75 views
4

D2009引入了對圖像和圖像列表的PNG支持。Delphi 2009中的PNG圖像列表和圖像

然而...

我有一個包含帶有alpha PNG圖像的圖像列表。我想用TImage將其中的一個放在窗體上。我如何做到這一點,並得到很好的合成圖像?

作爲問題的一個例子我面對下面的代碼無法正常工作,併產生所示的效果:

ImageList.GetBitmap(index, Image1.Picture.Bitmap); 

alt text http://clip2net.com/clip/m0/1234439882-clip-5kb.png

要解釋一點:

在表單上放置一個Timage,並在設計時使用Picture屬性加載一個帶alpha的PNG文件。請注意,它是如何正確地與表單完全透明合成的。

現在,在設計時,添加第二個空的Timage,添加一個TImagelist,並將相同的PNG添加到圖像列表中。我如何將TImageList中的PNG分配給第二個TImage,並使其看起來與第一個相同?

+0

另外,當然,這並不看起來像Delphi代碼。你確定這門語言? – Argalatyr 2009-02-11 00:30:39

+0

我是第二次以前的評論。 ;) – 2009-02-11 16:25:22

+0

@Ken - 你說得對C++ Builder - 我會調整這篇文章。 – Roddy 2009-02-12 10:45:08

回答

1

我剛試過一個簡單的測試。 TImageList包含一個帶有透明度的PNG圖像。我在第二個TImage上渲染圖像:

imlImageList.Draw(img2.Canvas,0,0,0);

對我來說,造成差異的原因是設置img2.Transparent:= true(我使用的是設計器,而不是代碼)。

1

我絆了這個討論線程:

Tranparent PNGs in D2009 TImageList

@Pekka Nyyssonen:設置顏色質量彙總到cd32Bit和DrawingStyle到dsTransparent 爲我工作。

我沒有獲得德爾福2009年我自己,所以我沒有帶嘗試過了,但...

0

有幾種方法,以透明圖像添加到圖像列表。

隨着AddMasked或InsertMasked,您添加圖像和標記的顏色是透明色:

procedure InsertMasked(Index: Integer; Image: TBitmap; MaskColor: TColor); 
function AddMasked(Image: TBitmap; MaskColor: TColor): Integer; 

隨着插入或添加,添加圖片和口罩。如果只使用來自圖像的白色像素的2色(黑色/白色)圖像,則其他圖像是透明的。

function Add(Image, Mask: TBitmap): Integer; 
procedure Insert(Index: Integer; Image, Mask: TBitmap); 
4

從我的研究,我發現的TImageList將圖像存儲爲TBitmaps,所以阿爾法信息丟失的存儲,你不能達到你要找的內容與當前執行的TImageList的。

更新:

多一點的實驗,並與下面的代碼,我可以使工作的透明度與下面的代碼。

ImageList1.ColorDepth := cd32Bit; 
Image2.Transparent := True; 
Image2.Canvas.Pen.Style := psClear; 
Image2.Canvas.Rectangle(0, 0, Image2.Width+1, Image2.Height+1); 
ImageList1.Draw(Image2.Canvas, 0,0,0); 

但它看起來不如加載的png漂亮。

0

據我所知,這不能達到目的。沒有給出的建議導致正確的alpha混合圖像,這是主要要求。

也許通過定義一個派生自TImageList的類,然後可以訪問受保護的方法,可以開始工作。現在我的解決方案是專門爲此使用第三方自定義ImageList組件。

2

檢查在
項目啓用該選項卡運行時主題 - >選項 - >應用程序選項卡

這解決了我的問題,我在RAD Studio 2010中