其实你很棒 2024-06-30 21:41 采纳率: 75%
浏览 9
已采纳

关于imageENview(ImageEN)中新建图层并根据鼠标位置添加图标

本人在利用delphi开发过程中,使用了第三方控件imageEN。目前想在加载的图片中进行标注。图标存储在imagelist中,现在不知道如何在imageENview中新建一个图层,并标注图标。请求帮助。给出源码或实现的说明,对重点代码注释。谢谢!
备注:根据各位的建议,各种程序都错了,问题归纳如下:1、 imagelist1.item[0]报错、imagelist1.GetIcon(0)报错 2、imageEN版本是ImageEn v10.2.0 ,图层可能不是Tlayer,可能是TIEImageLayer,至少程序可以运行,不报错。3、IEImageLayer.Bitmap.Canvas.Draw可以运行。完整代码如下。反正可以运行,但是添加图片就内存报错:

procedure TQRAmainFrame.Button1Click(Sender: TObject);
begin
   openimg;
end;

procedure TQRAmainFrame.ImageEnView1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 if button =mbright then  //添加右键菜单
  begin
   popupmenu1.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
   xpoint:=x;
   ypoint:=y;
  end;
end;

procedure TQRAmainFrame.N1Click(Sender: TObject);
begin
  openimg;
end;

procedure TQRAmainFrame.N2Click(Sender: TObject);
begin
   imageenview1.Clear;  //清空图片
end;

procedure TQRAmainFrame.N4Click(Sender: TObject);
 var
   icon:Ticon;
   icolayer:TIEImageLayer;
   IconIndex: Integer;
   Bitmap: TBitmap;
begin
   icon:=Ticon.Create;
   icolayer:=TIEImageLayer.Create(ImageEnView1);
   Bitmap:= TBitmap.Create;
   IconIndex:=0;
   try
     imagelist1.GetBitmap(IconIndex,bitmap);
     icolayer.Bitmap.Canvas.Draw(100,100,Bitmap);
   finally
     Bitmap.Free;
     icolayer.Free;
   end;
end;

procedure TQRAmainFrame.openimg;
begin
    //设置对话框过滤器,只显示图片格式的文件
   OpenDialog1.Filter := 'Image Files|*.jpg;*.jpeg;*.png;*.bmp;';
   OpenDialog1.Title:='请选择图片';
  if not OpenDialog1.Execute  then   exit;
     begin
      imageenview1.Clear;
      ImageEnView1.io.LoadFromFile(OpenDialog1.FileName);
     end;
end;
end.

  • 写回答

18条回答 默认 最新

  • 杨同学* 2024-07-01 08:59
    关注

    该回答结合ChatGPT4o及杨同学*共同作答, 如有帮助,还请采纳。
    在 Delphi 中使用 ImageEn 组件(版本 10.2.0)进行图像处理时,可以在 ImageEnView 中创建图层并添加图标。在你的例子中,你想根据鼠标位置在加载的图片上标注图标。下面我将提供详细的实现步骤和代码,并对关键部分进行注释。

    实现步骤

    1. 加载图像:使用 OpenDialog 加载图像文件到 ImageEnView
    2. 创建图层:在 ImageEnView 中创建一个新的图层,并使用该图层绘制图标。
    3. 添加图标:根据鼠标点击的位置,在新图层上添加图标。

    详细代码和注释

    unit Unit1;
    
    interface
    
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
      Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls,
      ImageEnView, ieview, iemview, ImageEn, iexLayerMView, iexLayers, iemio, iexUserInteractions,
      Vcl.ImgList, Vcl.Menus;
    
    type
      TForm1 = class(TForm)
        ImageEnView1: TImageEnView;
        ButtonLoadImage: TButton;
        OpenDialog1: TOpenDialog;
        PopupMenu1: TPopupMenu;
        MenuItemAddIcon: TMenuItem;
        ImageList1: TImageList;
        procedure ButtonLoadImageClick(Sender: TObject);
        procedure ImageEnView1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
        procedure MenuItemAddIconClick(Sender: TObject);
      private
        { Private declarations }
        XPos, YPos: Integer;
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.ButtonLoadImageClick(Sender: TObject);
    begin
      if OpenDialog1.Execute then
      begin
        ImageEnView1.Clear;
        ImageEnView1.IO.LoadFromFile(OpenDialog1.FileName);
      end;
    end;
    
    procedure TForm1.ImageEnView1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
      if Button = mbRight then  // 如果是右键点击
      begin
        PopupMenu1.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
        XPos := X; // 保存鼠标点击的 X 坐标
        YPos := Y; // 保存鼠标点击的 Y 坐标
      end;
    end;
    
    procedure TForm1.MenuItemAddIconClick(Sender: TObject);
    var
      IconIndex: Integer;
      Bitmap: TBitmap;
      IconLayer: TIEImageLayer;
    begin
      IconIndex := 0; // 假设你要添加 ImageList 中第一个图标
      Bitmap := TBitmap.Create;
      try
        // 从 ImageList 中获取图标到 Bitmap
        ImageList1.GetBitmap(IconIndex, Bitmap);
    
        // 创建一个新的图层
        IconLayer := TIEImageLayer.Create(ImageEnView1.Layers);
        IconLayer.Bitmap.Assign(Bitmap); // 将 Bitmap 赋值给图层
    
        // 设置图层的位置
        IconLayer.PosX := XPos; // 使用保存的 X 坐标
        IconLayer.PosY := YPos; // 使用保存的 Y 坐标
      finally
        Bitmap.Free; // 释放 Bitmap
      end;
    
      // 刷新 ImageEnView 显示
      ImageEnView1.Update;
    end;
    
    end.
    

    代码说明

    1. 图像加载

      procedure TForm1.ButtonLoadImageClick(Sender: TObject);
      begin
        if OpenDialog1.Execute then
        begin
          ImageEnView1.Clear;
          ImageEnView1.IO.LoadFromFile(OpenDialog1.FileName);
        end;
      end;
      
      • OpenDialog1 用于打开文件选择对话框。
      • ImageEnView1.IO.LoadFromFile 用于加载图像文件。
    2. 鼠标点击事件处理

      procedure TForm1.ImageEnView1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
      begin
        if Button = mbRight then
        begin
          PopupMenu1.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
          XPos := X;
          YPos := Y;
        end;
      end;
      
      • 检查是否右键点击。
      • 使用 PopupMenu1 显示右键菜单。
      • 保存鼠标点击位置的 XY 坐标。
    3. 添加图标

      procedure TForm1.MenuItemAddIconClick(Sender: TObject);
      var
        IconIndex: Integer;
        Bitmap: TBitmap;
        IconLayer: TIEImageLayer;
      begin
        IconIndex := 0;
        Bitmap := TBitmap.Create;
        try
          ImageList1.GetBitmap(IconIndex, Bitmap);
          IconLayer := TIEImageLayer.Create(ImageEnView1.Layers);
          IconLayer.Bitmap.Assign(Bitmap);
          IconLayer.PosX := XPos;
          IconLayer.PosY := YPos;
        finally
          Bitmap.Free;
        end;
        ImageEnView1.Update;
      end;
      
      • 使用 ImageList1.GetBitmapImageList 中获取图标。
      • 创建一个 TIEImageLayer 图层,并将图标绘制到图层上。
      • 根据之前保存的鼠标点击位置设置图层的位置。

    重要注意事项

    • 确保 ImageList 中的图标已经正确加载,并且索引值 0 是有效的。
    • 使用 TIEImageLayer 创建图层,以便在 ImageEnView 中进行图层操作。
    • 图层创建后,调用 ImageEnView1.Update 刷新显示内容。

    通过上述代码,你可以实现鼠标点击添加图标的功能。如果有任何问题或进一步的需求,请随时联系。

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

报告相同问题?

问题事件

  • 已采纳回答 7月1日
  • 修改了问题 6月30日
  • 修改了问题 6月30日
  • 创建了问题 6月30日

悬赏问题

  • ¥15 求修改代码,图书管理系统
  • ¥15 请问有没求偏多标签数据集yeast,reference,recreation,scene,health数据集。
  • ¥15 传感网应用开发单片机实训
  • ¥15 Delphi 关于sAlphaImageList使用问题
  • ¥15 寻找将CAJ格式文档转txt文本的方案
  • ¥20 数电设计提问求帮助,出租车计费器
  • ¥15 shein测试开发会问些啥我是写java的
  • ¥15 关于#单片机#的问题:我有个课程项目设计,我想在STM32F103veTX单片机,M3主控模块上设计一个程序,在Keil uVision5(C语言)上代码该怎么编译?(嫌钱少我可以加钱,急急急)
  • ¥15 opnet仿真网络协议遇到问题
  • ¥15 在安装python的机器学习程序包scikit-learn(1.1版本)时遇到如下问题