2010-09-26 82 views
1

隨着代碼位圖的透明度


procedure TForm2.Button1Click(Sender: TObject); 
var 
    oMeta: TMetaFile; 
    oBmp: TBitmap; 
begin 
    Image1.Transparent := True; 
    Image1.Picture.LoadFromFile('D:\data\WMF.wmf'); 

    oBmp := TBitmap.Create; 
    try 
    oMeta := TMetaFile(Image1.Picture.Graphic); 
    oBmp.SetSize(oMeta.Width, oMeta.Height); 
    oBmp.Canvas.Draw(0, 0, oMeta); 
    oBmp.SaveToFile('D:\data\WMF.bmp'); 
    finally 
    oBmp.Free; 
    end; 
end; 

我顯示WMF圖像和創建bmp文件。創建bmp圖像我用代碼顯示


procedure TForm2.Button2Click(Sender: TObject); 
begin 
    Image1.Transparent := True; 
    Image1.Picture.LoadFromFile('D:\data\WMF.bmp'); 
end; 

但是圖像顯示不透明。 Whay?我怎樣才能顯示這個透明度的BMP圖像?

TIA和問候 茨爾

回答

3

首先,你應該知道,透明的BMP的是非常罕見的。因此,許多(大多數)位圖查看器,編碼器和解碼器不支持透明位圖。但是,有一些希望。首先,許多位圖是32位的,即使像素最經常以格式$ 00BBGGRR存儲。每個「像素」的第一個字節因此未被使用,並且當然可以使用它作爲不透明度值:$ AABBGGRR。但這不僅是我個人的想法。大多數位圖使用version 3 bitmap header,但version 4(和版本5)實際上支持透明度數據。您只需指定紅色,綠色,藍色和alpha遮罩(例如分別爲$ 000000FF,$ 0000FF00,$ 00FF0000和$ FF000000),然後可以存儲每個像素的紅色,綠色,藍色和阿爾法強度。

不過,正如我所說的,大多數位圖查看器,編碼器和解碼器不支持透明位圖。我認爲VCL編碼器,解碼器和查看器(TImage)沒有。

我會考慮使用PNG而不是BMP。 PNG位圖圖像格式以許多不同的方式支持透明度。

+1

謝謝,我發現解決方案:BMP必須用24位PixelFormat(oBmp.PixelFormat:= pf24bit)創建,然後bmp圖像顯示爲透明! – Branko 2010-09-26 18:03:12

0

位圖不支持透明度,除非它是32位AFAIR。但我不確定是否可以在沒有第三方組件的情況下使用Delphi。你可以嘗試使用png而不是位圖。德爾福有TPNGImage。