使用 Delphi XE 从资源加载时如何保留 PNGImage 蒙版

发布于 2024-11-04 16:58:51 字数 1883 浏览 3 评论 0原文

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

I am upgrading my code to Delphi XE (from Delphi 7) and am trying to eliminate all unnecessary libraries. I've used PNGComponents for ages but it is time to move on and use the native TImageList and TPNGImage.

Part of my code loads an image list at runtime from linked in resources. My working PNGComponents code for this is:

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;

Using an answer in this question I am now trying the code below which shows the images but with black backgrounds, presumably because the mask is lost. I guess I need a mask bitmap to pass to ImageList_Add where the '0' is but I'm poor on this stuff. Does anyone know how I might get this working?

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;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

迷爱 2024-11-11 16:58:51

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

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

顺便说一句,您应该使用 Assign 而不是 AssignToAssignTo 是一种内部方法,可为 TPercient 启用温和形式的双重调度。

PNG images do partial transparency using alpha channels. They do not use masks. I imagine that your problem is that you are not retaining the alpha in your image list.

  • You should set your image list's ColorDepth to cd32Bit.
  • I would expect the bitmap's properties to be set correctly when you assign your PNG image to it so remove the line which sets AlphaFormat.

As an aside it is intended that you use Assign rather than AssignTo. AssignTo is an internal method that enables a mild form of double dispatch for TPersistent.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文