Как сохранить маску PNGImage при загрузке из ресурса с помощью Delphi XE
Я обновляю свой код до Delphi XE (с Delphi 7) и пытаюсь устранить все ненужные библиотеки. Я использовал png Components в течение многих лет, но пришло время двигаться дальше и использовать родной TImageList и TPNGImage.
Часть моего кода загружает список изображений во время выполнения из связанных ресурсов. Мой рабочий код png Components для этого:
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;
1 ответ:
Изображения PNG делают частичную прозрачность, используя Альфа-каналы. Они не пользуются масками. Я полагаю, что ваша проблема заключается в том, что вы не сохраняете Альфа в своем списке изображений.
- вы должны установить в списке изображений
ColorDepth
значениеcd32Bit
.- я ожидал бы, что свойства растрового изображения будут установлены правильно, когда вы назначаете ему изображение PNG, поэтому удалите строку, которая задает AlphaFormat.
В качестве отступления предполагается, что вы используете
Assign
, а неAssignTo
.AssignTo
является внутренним метод, который позволяет мягкую форму двойной отправки дляTPersistent
.