首页 > 解决方案 > TWICImage:如何保存透明的 BMP?

问题描述

我正在使用 Delphi 10.4.2,并且我有一个可以缩放图像(BMP、GIF、PNG、...)的应用程序。

我的问题是,如果输入图像是透明 BMP,则输出 BMP 不是透明的,而是黑色背景。当输入是透明 PNG 并且我想输出 BMP 时,也会发生这种情况。我怎样才能避免这种情况?

示例代码:

procedure TFrmTestGenImg.Resize;
var
  LInputImgPath, LOutputImgPath: string;
  LImageIn, LImageOut: TWICImage;
  LBitmap: TBitmap;
begin
  LInputImgPath := 'C:\temp\Input.bmp';

  LOutputImgPath := 'C:\temp\Output.bmp';

  LImageIn := TWICImage.Create;
  try
    LImageOut := TWICImage.Create;
    try
      LImageIn.Transparent := True;
      LImageIn.LoadFromFile(Trim(LInputImgPath));

      LBitmap := TBitmap.Create;
      try
        LBitmap.PixelFormat := pf32bit;
        LBitmap.Assign(LImageIn);
        LBitmap.Transparent := True;
        { ... Resizing bitmap ... }

        LImageOut.Assign(LBitmap);
        LImageOut.ImageFormat := wifBmp;
        LImageOut.Transparent := LImageIn.Transparent;
        LImageOut.SaveToFile(LOutputImgPath);
      finally
        LBitmap.Free;
      end;
    finally
      LImageOut.Free;
    end;
  finally
    LImageIn.Free;
  end;
end;

标签: imagedelphidelphi-10.4-sydneywicdelphi-10.4.2

解决方案


VCL 中不支持 alpha 通道透明度,这似乎是您想要的。我从来没有使用过 TWCImage 并且谷歌搜索它没有透露任何内容,所以我不确定如何建议你如何使用它。

一种能够做你想做的事情的简单方法是使用在 SourceForge 上免费下载的 Image32 库——它可以读取包括具有透明度的 PNG 在内的文件。您可以使用透明度渲染图像,并且可以将其与 VCL 和 FMX 一起使用。

https://sourceforge.net/projects/image32/

(我建议这不是为了推广 Image32(尽管我认为它很棒),而是为了回答关于如何处理透明度的 OP 问题。


推荐阅读