Как сохранить маску PNGImage при загрузке из ресурса с помощью Delphi XE - PullRequest
5 голосов
/ 04 мая 2011

Я обновляю свой код до 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;

1 Ответ

2 голосов
/ 04 мая 2011

PNG изображения делают частичную прозрачность, используя альфа-каналы.Они не используют маски.Я полагаю, что ваша проблема в том, что вы не сохраняете альфа в своем списке изображений.

  • Вам следует установить для ColorDepth в списке изображений cd32Bit.
  • Я ожидаюсвойства растрового изображения должны быть установлены правильно, когда вы назначаете ему свое PNG-изображение, поэтому удалите строку, которая устанавливает AlphaFormat.

В качестве отступа предполагается, что вы используете Assign вместо AssignTo.AssignTo - это внутренний метод, который позволяет использовать мягкую форму двойной отправки для TPersistent.

...