我正在将我的代码升级到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‘是’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;发布于 2011-05-04 19:54:33
PNG图像使用alpha通道执行部分透明。他们不使用口罩。我想你的问题是你没有在你的图像列表中保留alpha。
PNG
ColorDepth设置为cd32Bit.
顺便说一句,您应该使用Assign而不是AssignTo。AssignTo是一种内部方法,可为TPersistent启用温和形式的双重调度。
https://stackoverflow.com/questions/5882560
复制相似问题