如何保存PNGImage掩码时,从资源加载使用Delphi XE



我正在将我的代码升级到Delphi XE(从Delphi 7),并试图消除所有不必要的库。我已经使用PNGComponents很长时间了,但现在是时候继续使用本地的TImageList和TPNGImage了。

我的部分代码在运行时从链接的资源中加载图像列表。我的工作PNGComponents代码是:

function CreateAndLoadImageList( ASize : integer ) : TPngImageList;
var
  PngObject : TPngObject;
  I : integer;
begin
  Result := TPngImageList.Create( nil );
  Result.BeginUpdate;
  try
    Result.Width := ASize;
    Result.Height := ASize;
    PngObject := TPngObject.create;
    try
      For I := 0 to Length( ArtImageNames ) -1 do
        begin
        PngObject.LoadFromResourceName( hInstance, Format( 'AImg%d_%d', [ASize, I]));
        Result.PngImages.Add( False).PngImage := PngObject;
        end;
    finally
      PngObject.Free;
    end;

  finally
    Result.EndUpdate;
  end;
end;

使用这个问题的答案,我现在正在尝试下面的代码,显示图像,但与黑色背景,大概是因为掩码丢失。我想我需要一个掩码位图传递给ImageList_Add '0'的地方,但我在这方面很差。有人知道我该怎么让它工作吗?

function CreateAndLoadImageList( ASize : integer ) : TImageList;
var
  PngImage : TPngImage;
  bmp : TBitmap;
  I : integer;
begin
  Result := TImageList.Create( nil );
  Result.Masked := False;
  Result.DrawingStyle := dsTransparent;
  Result.BeginUpdate;
  try
    Result.Width := ASize;
    Result.Height := ASize;
    Result.Masked := False;
    PngImage := TPngImage.create;
    try
      For I := 0 to Length( ArtImageNames ) -1 do
        begin
        PngImage.LoadFromResourceName( hInstance, Format( 'AImg%d_%d', [ASize, I]));

        bmp:=TBitmap.Create;
        PngImage.AssignTo(bmp);
        bmp.AlphaFormat:=afIgnored;
        ImageList_Add( Result.Handle, bmp.Handle, 0);
        Bmp.Free;
        end;
    finally
      PngImage.Free;
    end;

  finally
    Result.EndUpdate;
  end;
end;

PNG图像使用alpha通道实现部分透明。他们不戴口罩。我想您的问题是您没有在图像列表中保留alpha。

  • 你应该设置你的图像列表的ColorDepthcd32Bit
  • 我希望位图的属性设置正确,当你分配你的PNG图像,所以删除设置AlphaFormat的行。

作为题外话,您打算使用Assign而不是AssignToAssignTo是一个内部方法,为TPersistent提供了一种温和形式的双调度。

相关内容

  • 没有找到相关文章

最新更新