代码之家  ›  专栏  ›  技术社区  ›  Branko

带透明度的位图

  •  1
  • Branko  · 技术社区  · 14 年前

    带代码

    
    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;
    

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

    但图像显示时没有透明度。什么?如何以透明方式显示此bmp图像?

    敬礼

    2 回复  |  直到 14 年前
        1
  •  3
  •   Andreas Rejbrand    14 年前

    首先,你应该知道透明BMP是非常罕见的。因此,许多(大多数)位图查看器、编码器和解码器不支持透明位图。不过,还是有一些希望的。首先,许多位图是32位的,尽管像素通常以$00BBGGRR格式存储。因此,每个“像素”的第一个字节是未使用的,当然可以使用它作为不透明度值:$AABBGGRR。但这不仅仅是我个人的想法。大多数位图使用 version 3 bitmap header version 4 (和版本5)实际上支持透明数据。只需指定红色、绿色、蓝色和alpha遮罩(例如分别为$000000FF、$0000FF00、$00FF0000和$FF000000),然后就可以存储每个像素的红色、绿色、蓝色和alpha强度。

    不过,正如我所说,大多数位图查看器、编码器和解码器都不支持透明位图。我认为VCL编码器、解码器和查看器( TImage

    我会考虑使用PNG而不是BMP。PNG位图图像格式以许多不同的方式支持透明度。

        2
  •  0
  •   Linas    14 年前