首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用Delphi XE从资源加载时保留PNGImage掩码

如何在使用Delphi XE从资源加载时保留PNGImage掩码
EN

Stack Overflow用户
提问于 2011-05-04 19:21:12
回答 1查看 1.9K关注 0票数 5

我正在将我的代码升级到Delphi XE (从Delphi 7),并试图消除所有不必要的库。我已经使用PNGComponents很久了,但现在是时候继续使用原生TImageList和TPNGImage了。

我的部分代码在运行时从链接的资源加载图像列表。我的工作PNGComponents代码是:

代码语言:javascript
复制
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‘,但我在这方面做得很差。有没有人知道我该怎么做?

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-04 19:54:33

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

PNG

  • 您应该将图像列表的ColorDepth设置为cd32Bit.

  • I当您将PNG图像分配给位图时,希望位图的属性设置正确,因此删除设置AlphaFormat的行。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5882560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档