5

我正在将我的代码升级到 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;

使用this question中的答案我现在正在尝试下面的代码,该代码显示图像但具有黑色背景,大概是因为蒙版丢失了。我想我需要一个掩码位图来传递给 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;
4

1 回答 1

2

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

  • 您应该将图像列表设置ColorDepthcd32Bit.
  • 当您将PNG图像分配给位图时,我希望位图的属性设置正确,因此请删除设置AlphaFormat的行。

顺便说一句,它旨在您使用Assign而不是AssignTo. AssignTo是一种内部方法,可以对TPersistent.

于 2011-05-04T11:54:32.987 回答