2010-09-26 96 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。