引言
对于 Delphi7 开发者来说,处理图片加载、显示、格式转换是常见需求,而 ImageEnView 组件就是一款轻量又强大的图像处理工具 ------ 它无需复杂配置,就能快速实现图片加载、缩放、旋转、保存,甚至轻松将图片转为 PDF,不管是给自己的项目加图片处理功能,还是批量生成 PDF,都能轻松搞定。
一、组件简介:为什么选择 TImageEnView?
TImageEnView 是 Delphi 中一个功能强大的图像显示与处理组件。它远不止一个简单的图片框,而是一个集加载 、显示 、编辑 、转换于一体的图像处理中心。
在 Delphi 7 项目中,当遇到需要显示多种格式图片、进行基础图像操作(缩放、旋转、裁剪),甚至是将图像转换为 PDF 等高级需求时,TImageEnView 通常是比标准 TImage 组件更优的选择。
核心优势:
- 格式支持广泛:轻松加载 JPG、PNG、BMP、GIF 等常见格式。
- 内置处理功能:提供缩放、旋转、翻转、裁剪等常用操作,无需手动操作像素。
- 集成输出能力:支持将图像保存为多种格式,并可通过插件实现 PDF 生成等高级功能。
- 显示交互友好:内置鼠标拖动、缩放查看等交互模式,提升用户体验。
二、快速入门:从加载第一张图片开始
- 添加组件 :在 Delphi 7 的组件面板中找到 "ImageEn" 或 "ImageEnView",将其拖放到窗体上。

- 加载图像:使用以下两种最基本的方式之一,即可在界面中显示图片。
bash
// 方法1:从文件加载(最常用)
ImageEnView1.IO.LoadFromFile('C:\你的图片.jpg');
// 方法2:从流加载(适用于网络或数据库读取的图像数据)
var
AStream: TMemoryStream;
begin
AStream := TMemoryStream.Create;
try
// ... 假设从某处将图像数据填充到 AStream 中
ImageEnView1.IO.LoadFromStream(AStream);
finally
AStream.Free;
end;
end;
begin
OpenDialog1.Filter := '图片文件|*.jpg;*.jpeg;*.png;*.bmp|JPG文件|*.jpg;*.jpeg|PNG文件|*.png|BMP文件|*.bmp';
OpenDialog1.Title := '选择要加载的图片';
if OpenDialog1.Execute then
begin
try
ImageEnView1.IO.LoadFromFile(OpenDialog1.FileName);
ShowMessage('图片加载成功!');
except
on E: Exception do
begin
ShowMessage('图片加载失败:' + E.Message);
end;
end;
end;
end;
三、核心功能与常用方法详解
下面的表格将 TImageEnView 的常用操作进行了分类和说明,你可以像查阅字典一样快速找到所需功能:
| 功能类别 | 方法/属性 | 说明与示例 |
|---|---|---|
| 基础操作 | LoadFromFile | 从文件加载:ImageEnView1.IO.LoadFromFile('test.jpg'); |
| - | SaveToFile | 保存到文件:ImageEnView1.IO.SaveToFile('output.png'); |
| - | Clear / Blank | 清空图像:ImageEnView1.Clear; 或 ImageEnView1.Blank; (后者创建空白画布) |
| 图像信息 | Bitmap.Width / .Height | 获取图像尺寸(单位:像素)。注意:直接访问 Bitmap 前,需确保图像已成功加载。 |
| - | IsEmpty | 判断是否为空:if not ImageEnView1.IsEmpty then begin ... end; |
| 几何变换 | Proc.Rotate | 旋转图像(度):ImageEnView1.Proc.Rotate(90); // 顺时针旋转90度 |
| - | Proc.Flip(xx) | 水平翻转:ImageEnView1.Proc.Flip( |
| 显示控制 | ZoomIn / ZoomOut | 缩放显示(不影响实际图像数据):ImageEnView1.ZoomIn; |
| - | Fit(True/False) | 适应窗口:ImageEnView1.Fit(True); |
| - | ScrollBars | 控制滚动条:ImageEnView1.ScrollBars := ssBoth; // 显示水平和垂直滚动条 |
| 画图 | Draw | ImageEnView1.Bitmap.Canvas.Draw(x, y, 源图片); 在指定坐标(x,y)绘制原图大小的图片 |
| - | TextOut(x,y,text); | ImageEnView1.Bitmap.Canvas.TextOut(x, y, xx文字); 在指定坐标(x,y)写上文字 |
重要提示:
- 除了方法,这两个属性日常使用频率极高:
- ImageEnView1.IsEmpty:判断组件中是否有图片(返回 True = 无图片,False = 有图片);
- ImageEnView1.Bitmap.Width/Height:获取当前图片的宽度和高度(用于判断图片尺寸是否符合要求)。
- 许多图像处理功能(如
Rotate)位于Proc属性下,而文件操作(如Load, Save)位于 IO 属性下。这是该组件一个常见的混淆点。
ImageEnView.IO
bash
// 将图像加载到 ImageEnView 中
ImageEnView1.IO.LoadFromFile('C:\Hello.jpeg');
// 从 Twain 扫描仪获取图像并显示在 ImageEnView 中
ImageEnView1.IO.AcquireParams.YResolution := 300;
ImageEnView1.IO.AcquireParams.XResolution := 300;
ImageEnView1.IO.Acquire();
// 显示高级 TIFF 保存属性
ImageEnView1.IO.SimplifiedParamsDialogs := False;
ImageEnView1.IO.DoPreviews([ppTIFF]);
// 将 PNG 转换为 JPEG,质量为 90%
ImageEnView1.IO.LoadFromFile('D:\image.png');
ImageEnView1.IO.Params.JPEG_Quality := 90;
ImageEnView1.IO.SaveToFile('D:\output.jpg');
// 保存 CMYK 格式的 TIFF
ImageEnView1.IO.LoadFromFile('D:\image.tif');
ImageEnView1.IO.Params.TIFF_PhotometInterpret := ioTIFF_CMYK;
ImageEnView1.IO.SaveToFile('D:\image-cmyk.tif');
// 提示打印当前图像
ImageEnView1.IO.DoPrintPreviewDialog(iedtDialog);
TImageEnView.Proc 用法
bash
ImageEnView1.Proc.DoPreviews(ppeColorAdjust);
// 提示用户对当前图像进行颜色调整

bash
// 提示用户对当前图像应用图像效果
ImageEnView1.Proc.DoPreviews(ppeSpecialEffects);

bash
// 提示用户对当前图像进行编辑操作
ImageEnView1.Proc.DoPreviews(ppeEditingFunctions);

bash
// 将 TImageEnView 中的图像顺时针旋转 90°
ImageEnView1.Proc.Rotate(270);
// 增加位图矩形区域 (0,0,49,49) 的对比度
ImageEnView1.SelectionBase := iesbBitmap;
ImageEnView1.Select(0, 0, 50, 50);
ImageEnView1.Proc.Contrast(10);
ImageEnView1.Deselect();
// 将 TImageEnView 中的图像大小减少到原来的一半(保存时文件会小得多)
ImageEnView1.Proc.Resample(ImageEnView1.IEBitmap.Width div 2, -1, rfLanczos3);
四、实战案例:将多张图片合并生成一个PDF文件
这是一个非常实用的功能,常用于生成电子报告或档案。TImageEnView 通过其 IO 属性可以方便地操作 PDF。
下面的示例演示了如何创建一个 PDF 文件,并将两张图片依次添加为其中的页面。
bash
uses
ImageEnView;
procedure TForm2.btnCropClick(Sender: TObject);
var
AImageEnPDF: TImageEnView; // 声明ImageEnView对象
AImageName1, AImageName2: string; // 两张图片的路径
APDFName: string; // 生成的PDF路径
begin
// 1. 定义图片和PDF的保存路径(程序根目录下)
AImageName1 := ExtractFilePath(Application.ExeName) + '6390000.jpg';
AImageName2 := ExtractFilePath(Application.ExeName) + '240227.jpg';
APDFName := ExtractFilePath(Application.ExeName) + '合并图片.pdf';
// 2. 创建ImageEnView对象(动态创建,无需在窗体上放置组件)
AImageEnPDF := TImageEnView.Create(Self);
try
// 3. 创建PDF文件,并设置PDF属性
AImageEnPDF.IO.CreatePDFFile(APDFName); // 初始化PDF文件
AImageEnPDF.IO.Params.PDF_Title := '我的图片合集'; // PDF标题
AImageEnPDF.IO.Params.PDF_Author := '小白开发者'; // PDF作者
// 4. 加载第一张图片,添加到PDF
if FileExists(AImageName1) then // 先判断图片是否存在
begin
AImageEnPDF.IO.LoadFromFile(AImageName1); // 加载本地图片
// AImageEnPDF.IO.Params.PDF_Compression := ioPDF_JPEG; // 设置PDF压缩方式(JPEG压缩,体积更小)
AImageEnPDF.IO.Params.JPEG_Quality := 90; // 压缩质量(0-100,数值越高越清晰,体积越大)
AImageEnPDF.IO.SaveToPDF; // 将图片保存为PDF第一页
ShowMessage('第一张图片已添加到PDF');
end
else
begin
ShowMessage('第一张图片不存在:' + AImageName1);
Exit; // 图片不存在则退出
end;
// 5. 加载第二张图片,添加到PDF(可重复添加多张)
if FileExists(AImageName2) then
begin
AImageEnPDF.IO.LoadFromFile(AImageName2); // 加载第二张图片
AImageEnPDF.IO.SaveToPDF; // 将图片保存为PDF第二页
ShowMessage('第二张图片已添加到PDF');
end
else
begin
ShowMessage('第二张图片不存在:' + AImageName2);
Exit;
end;
// 6. 关闭PDF文件(完成写入,否则PDF无法打开)
AImageEnPDF.IO.ClosePDFFile;
ShowMessage('PDF生成成功!路径:' + APDFName);
// 可选:查看图片属性
if not AImageEnPDF.IsEmpty then // 判断是否有图片
begin
ShowMessage(Format('最后一张图片尺寸:宽%d 高%d', [AImageEnPDF.Bitmap.Width, AImageEnPDF.Bitmap.Height]));
end;
finally
// 7. 释放对象,避免内存泄漏
if Assigned(AImageEnPDF) then FreeAndNil(AImageEnPDF);
end;
end;
代码说明:
- 动态创建组件:无需在窗体上放置 ImageEnView,用TImageEnView.Create(Self)即可创建,灵活方便;
- PDF 初始化:CreatePDFFile用于创建空白 PDF,必须先调用这一步,才能添加图片;
- 图片添加 :每加载一张图片后,调用SaveToPDF即可将图片作为新页添加到 PDF,可循环添加多张;
- 压缩设置:ioPDF_JPEG压缩方式比默认压缩体积更小,适合批量图片;
- 释放资源:finally块中释放对象,避免 Delphi 内存泄漏;
- 异常判断:添加FileExists判断图片是否存在,避免因图片缺失导致程序报错。
五、进阶技巧与注意事项
- 画布操作与Bitmap 属性:当需要进行像素级绘图(如画线、写字、添加水印)时,可以访问
ImageEnView1.Bitmap.Canvas。但在操作前,务必确保 Bitmap 已被正确初始化(例如,已加载图片或执行过 Blank 方法)。
bash
// 在图片上绘制红色文字水印
if not ImageEnView1.IsEmpty then
begin
with ImageEnView1.Bitmap.Canvas do
begin
Font.Color := clRed;
Font.Size := 20;
Brush.Style := bsClear; // 透明背景
TextOut(10, 10, '样品水印');
end;
ImageEnView1.Update; // 刷新显示
end;

2. 内存管理 :动态创建的 TImageEnView 对象(Create(nil))必须在 finally 块中释放 ,以防止内存泄漏。当其作为窗体上的组件时,窗体会自动管理其生命周期。
3. 错误处理 :在加载外部文件时,应使用 try..except 进行包裹,以处理文件不存在或格式不兼容等异常。
bash
try
ImageEnView1.IO.LoadFromFile('不确定的路径.jpg');
except
on E: Exception do
ShowMessage('加载图片失败:' + E.Message);
end;