加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 09:46:53 所属栏目:大数据 来源:网络整理
导读:我正在将我的代码升级到Delphi XE(来自Delphi 7),并试图消除所有不必要的库.我已经使用了PNGComponents很多年了,但现在是时候继续使用原生的T ImageList和TPNG Image了. 我的部分代码在运行时从链接的资源中加载图像列表.我的工作PNGComponents代码是: func
我正在将我的代码升级到Delphi XE(来自Delphi 7),并试图消除所有不必要的库.我已经使用了PNGComponents很多年了,但现在是时候继续使用原生的T ImageList和TPNG Image了.

我的部分代码在运行时从链接的资源中加载图像列表.我的工作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’但是我对这个东西很差.有谁知道我怎么会这样工作?

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,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;

解决方法

PNG图像使用Alpha通道进行部分透明.他们不使用面具.我想你的问题是你没有在图像列表中保留alpha.

>您应该将图像列表的ColorDepth设置为cd32Bit.
>我希望在将PNG图像分配给它时正确设置位图的属性,因此删除设置AlphaFormat的行.

另外,它旨在使用Assign而不是AssignTo. AssignTo是一种内部方法,可为TPersistent启用温和形式的双重调度.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读