其实你很棒 2024-07-02 20:44 采纳率: 68.8%
浏览 0
已结题

Delphi 关于sAlphaImageList使用问题

《代码已经按照楼下各位的建议》改了,还是无法解决。代码更新了。
本人在利用delphi开发过程中,使用了第三方控件imageEN和AlphaControls。目前想在加载的图片中进行标注,部分功能已经实现,但是无法解决png图像作为图标的问题。图标PNG格式存储在AlphaControls组件下的sAlphaImageList中。代码如下,请高人纠错,谢谢。

img

procedure ConvertImageListImageToGraphic(sAlphaImageList: TsAlphaImageList;
          Index: Integer; out PNGImage: TPngImage);
var
  Bitmap: TBitMap;
begin
  Bitmap := TBitMap.Create;
  try
     // 获取图片列表中指定索引的位图
    sAlphaImageList.GetBitmap(index,Bitmap);
    pngImage:=TpngImage.Create;
    pngImage.Assign(Bitmap);
  finally
    Bitmap.Free;
  end;
end;
procedure TForm1.N4Click(Sender: TObject);
begin
 var
  Graphic: TpngImage;
  try
    ConvertImageListImageToGraphic(sAlphaImageList1, 2, Graphic);
   with  ImageEnView1 do
    begin
     LayersAdd(ielkImage,ClientPos.X,ClientPos.Y,Graphic.Width ,Graphic.Height);
     CurrentLayer.Bitmap.Canvas.Draw(0,0,Graphic);
     CurrentLayer.Bitmap.SetTransparentColors(CreateRGB(125, 125, 125), CreateRGB(255, 255, 255),0);
     //CurrentLayer.Fillcolor:= clNone; //背景填充色为空
     CurrentLayer.Update;
     CurrentLayer.Locked:= False;
    end;
    finally
    Graphic.Free;
  end;
end;

  • 写回答

24条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-07-02 20:44
    关注

    引自免费微信小程序:皆我百晓生

    从你的代码来看,似乎你想将sAlphaImageList中的PNG图片取出来,然后显示在ImageEnView组件上。我注意到了一些可能的问题和可以改进的地方。下面是我对你代码的修改建议:

    首先,你的ConvertImageListImageToGraphic过程似乎有些混淆。你试图将sAlphaImageList中的图像转换为PNG格式,但是这样的转换并不是必需的,因为你已经知道图像已经是PNG格式并存储在sAlphaImageList中了。更重要的是,你在这个过程中试图检查Graphic是否是TPngImage类型,并尝试对其进行赋值操作,这是不正确的。你应该直接使用TPngImage来处理从sAlphaImageList获取的位图。

    下面是修改后的代码:

    procedure ConvertImageListImageToPng(sAlphaImageList: TsAlphaImageList; Index: Integer; out PNGImage: TPngImage);
    var
      Bitmap: TBitmap;
    begin
      Bitmap := TBitmap.Create;
      try
        // 获取图片列表中指定索引的位图
        sAlphaImageList.GetBitmap(Index, Bitmap);
        // 直接创建TPngImage对象并赋值
        PNGImage := TPngImage.Create;
        PNGImage.Assign(Bitmap);
      finally
        Bitmap.Free;
      end;
    end;
    
    procedure TForm1.N4Click(Sender: TObject);
    begin
      // 创建TPngImage对象用于存储从sAlphaImageList获取的图像
      var PNGGraphic: TPngImage;
      try
        ConvertImageListImageToPng(sAlphaImageList1, 0, PNGGraphic); // 这里传递TPngImage的引用(使用out参数)
        with ImageEnView1 do begin
          LayersAdd(ielkImage, ClientPos.X, ClientPos.Y, 100, 100); // 添加新图层
          CurrentLayer.Bitmap := TPngBitmap.Create; // 使用TPngBitmap来支持PNG图像
          CurrentLayer.Bitmap.Canvas.Draw(0, 0, PNGGraphic); // 在新图层上绘制PNG图像
          CurrentLayer.Bitmap.SetTransparentColors(...); // 设置透明色(如果需要)
          CurrentLayer.Update; // 更新图层内容
          CurrentLayer.Locked := False; // 解锁图层(如果需要)
        end;
      finally
        PNGGraphic.Free; // 释放TPngImage对象
      end;
    end;
    

    这个修改版的代码应该更接近你的需求。这里我创建了一个ConvertImageListImageToPng过程来从sAlphaImageList中获取PNG图像,然后在你的点击事件中调用这个过程来获取图像并在ImageEnView上显示它。请注意我使用了out参数来传递TPngImage对象,这样你可以在过程外部处理这个对象。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(23条)

报告相同问题?

问题事件

  • 系统已结题 7月13日
  • 已采纳回答 7月5日
  • 修改了问题 7月2日
  • 创建了问题 7月2日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?