You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Inno Setup向导页加载带透明通道的PNG图片?

在Inno Setup代码段加载带透明通道PNG的解决方法

你遇到的问题是因为TBitmap.LoadFromFile原生对PNG透明通道的支持不完善,需要借助GDI+来实现正确加载。以下是具体的实现步骤:

1. 声明GDI+相关函数

在[Code]段开头添加GDI+的函数声明,用于初始化、加载图片和清理资源:

const
  GDIPVER = $0110;

type
  TGpStatus = Integer;
  TGpImage = Pointer;
  TGpBitmap = Pointer;

function GdiplusStartup(token: Cardinal; input: Pointer; output: Pointer): TGpStatus;
  external 'GdiplusStartup@gdiplus.dll stdcall';
function GdiplusShutdown(token: Cardinal): TGpStatus;
  external 'GdiplusShutdown@gdiplus.dll stdcall';
function GdipCreateBitmapFromFile(filename: WideString; out bitmap: TGpBitmap): TGpStatus;
  external 'GdipCreateBitmapFromFile@gdiplus.dll stdcall';
function GdipCreateHBITMAPFromBitmap(bitmap: TGpBitmap; out hbm: THandle; background: Cardinal): TGpStatus;
  external 'GdipCreateHBITMAPFromBitmap@gdiplus.dll stdcall';
function GdipDisposeImage(image: TGpImage): TGpStatus;
  external 'GdipDisposeImage@gdiplus.dll stdcall';

2. 封装透明PNG加载函数

添加一个专门的函数,负责通过GDI+加载带透明通道的PNG并转换为TBitmap:

procedure LoadTransparentPNG(const Filename: string; DestBitmap: TBitmap);
var
  GdiPlusToken: Cardinal;
  GpBitmap: TGpBitmap;
  HBitmap: THandle;
begin
  // 初始化GDI+环境
  if GdiplusStartup(GdiPlusToken, nil, nil) = 0 then
  begin
    // 从文件创建GDI+位图对象
    if GdipCreateBitmapFromFile(ExpandConstant(Filename), GpBitmap) = 0 then
    begin
      // 将GDI+位图转换为带透明的HBITMAP
      if GdipCreateHBITMAPFromBitmap(GpBitmap, HBitmap, $FFFFFFFF) = 0 then
      begin
        // 将HBITMAP赋值给目标TBitmap
        DestBitmap.Assign(HBITMAP(HBitmap));
        DeleteObject(HBitmap);
      end;
      // 释放GDI+位图资源
      GdipDisposeImage(GpBitmap);
    end;
    // 关闭GDI+环境
    GdiplusShutdown(GdiPlusToken);
  end;
end;

3. 使用加载函数替换原生方法

在需要加载透明PNG的地方,用LoadTransparentPNG代替原来的LoadFromFile:

// 替换 MyImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\on.png'));
LoadTransparentPNG('{tmp}\on.png', MyImage.Bitmap);

补充说明

  • 该方法依赖系统自带的GDI+库,Windows XP及以上版本系统默认已预装,无需额外分发。
  • 加载后的图片会保留完整的Alpha通道信息,在向导页的浅色/深色模式下都能正确显示透明效果。

内容的提问来源于stack exchange,提问作者Drakul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 01:20:03