`
sogotobj
  • 浏览: 671963 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

GDI+ 在Delphi程序的应用 -- 多帧(页)图像的分解与合成

阅读更多

GDI+ 在Delphi程序的应用 -- 多帧(页)图像的分解与合成

在GDI+支持的各种图像格式,gif格式和tiff格式图像可包含多帧(页)图片,GDI+可以很方便的分解和合成多帧(页)图片。

下面是个简单的多帧(页)图片分解与合成例子:

unitmain1;

interface

uses
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
Dialogs,StdCtrls;

type
TForm1
=class(TForm)
Button1:TButton;
Button2:TButton;
procedureButton1Click(Sender:TObject);
procedureButton2Click(Sender:TObject);
private
{Privatedeclarations}
public
{Publicdeclarations}
end;

var
Form1:TForm1;

implementation

usesGdiplus,GdipTypes,ActiveX;

{$R
*.dfm}

//把多帧图像分解为单图像保存到文件
procedureTForm1.Button1Click(Sender:TObject);
var
I,Count:Integer;
Clsid:TClsid;
Parameters:TEncoderParameters;
Quality:Integer;
Image:TGpImage;
GUID:TGUID;
begin
//打开图像文件
Image:=TGpImage.Create('hbmap108.gif');
try
//获取图像所有帧维度的GUID,这里我们只取第一个
Image.GetFrameDimensionsList(@GUID,1);
//通过获取维度的GUID,取得图像的帧(页)数量
Count:=Image.GetFrameCount(GUID);

//下面设置自定义的编码参数,这里为1个参数
Parameters.Count:=1;
//设置参数唯一标志的GUID,这里为编码品质
Parameters.Parameter[0].Guid:=EncoderQuality;
//设置参数值的数据类型为长整型
Parameters.Parameter[0].ValueType:=EncoderParameterValueTypeLong;
Parameters.Parameter[
0].NumberOfValues:=1;
//设置参数的值:品质等级,最高为100,图像文件大小与品质成正比
Quality:=100;
Parameters.Parameter[
0].Value:=@Quality;

//获取图像格式JPEG编码器的ClsID
GetEncoderClsid('image/jpeg',Clsid);

//选择图像的各个帧为当前帧,并依次保存为jpg文件
forI:=0toCount-1do
begin
Image.SelectActiveFrame(GUID,I);
Image.Save(
'Hb'+IntToStr(I)+'.jpg',Clsid,@Parameters);
end;
finally
Image.Free;
end;
end;

//将单个图像合并为多帧图像,GDI+不支持GIF合成,只能合并为tiff格式
procedureTForm1.Button2Click(Sender:TObject);
var
Parameters:TEncoderParameters;
Value:TEncoderValue;
Img,tmp:TGpImage;
I:Integer;
Clsid:TClsid;
begin
//下面设置自定义的编码参数,这里为1个参数
Parameters.Count:=1;
//设置参数唯一标志的GUID,这里为保存标记
Parameters.Parameter[0].Guid:=EncoderSaveFlag;
Parameters.Parameter[
0].NumberOfValues:=1;
Parameters.Parameter[
0].ValueType:=EncoderParameterValueTypeLong;
//设置参数的值。这里只把Value地址赋给了参数值,Value在后面具体赋值
Parameters.Parameter[0].Value:=@Value;

//打开第一个图像,这里的图像是前面代码分解后保存的jpg文件
Img:=TGpImage.Create('Hb0.jpg');
try
//获取图像格式tiff编码器的ClsID
GetEncoderClsid('image/tiff',Clsid);
//在保存第一帧图像时,编码参数值设置为多帧
Value:=EncoderValueMultiFrame;
//保存第一帧图像
Img.Save('Hb.tif',Clsid,@Parameters);
//保存随后的各帧图像时,编码参数值设置为维度页
Value:=EncoderValueFrameDimensionPage;

//依次打开后面的图像,保存到Hb.tif文件,本例图片为24帧
forI:=1to23do
begin
tmp:
=TGpImage.Create('Hb'+IntToStr(I)+'.jpg');
try
Img.SaveAdd(tmp,@Parameters);
finally
tmp.Free;
end;
end;
finally
Img.Free;
end;

end;

end.

例子中已经作了较详细的注释,就不再对代码讲解了。但是有必要对编码参数作点说明:

TEncoderParameters是个封装图像编码器参数TEncoderParameter的数组类型结构,成员包括TEncoderParameter类型数组和数组个数。而编码参数类型TEncoderParameter定义如下:

//---------------------------------------------------------------------------
//EncoderParameterstructure
//---------------------------------------------------------------------------
TEncoderParameter=packedrecord
Guid:TGUID;
//该参数全局唯一标识符(GUID),
NumberOfValues:ULONG;//Value地址处包含的元素个数
ValueType:TEncoderParameterValueType;//Value所指值的数据类型
Value:Pointer;//值的地址,可以为单值或者数组,具体根据Guid而定
PEncoderParameter=^TEncoderParameter;

编码参数结构的Guid已经在GDI+中作了如下定义:

//---------------------------------------------------------------------------
//Encoderparametersets图像编码器参数类别设置
//---------------------------------------------------------------------------

EncoderCompression:TGUID
='{e09d739d-ccd4-44ee-8eba-3fbf8be4fc58}';//压缩
{$EXTERNALSYMEncoderCompression}
EncoderColorDepth:TGUID
='{66087055-ad66-4c7c-9a18-38a2310b8337}';//颜色深度
{$EXTERNALSYMEncoderColorDepth}
EncoderScanMethod:TGUID
='{3a4e2661-3109-4e56-8536-42c156e7dcfa}';//扫描方法
{$EXTERNALSYMEncoderScanMethod}
EncoderVersion:TGUID
='{24d18c76-814a-41a4-bf53-1c219cccf797}';//版本
{$EXTERNALSYMEncoderVersion}
EncoderRenderMethod:TGUID
='{6d42c53a-229a-4825-8bb7-5c99e2b9a8b8}';//呈现方法
{$EXTERNALSYMEncoderRenderMethod}
EncoderQuality:TGUID
='{1d5be4b5-fa4a-452d-9cdd-5db35105e7eb}';//质量
{$EXTERNALSYMEncoderQuality}
EncoderTransformation:TGUID
='{8d0eb2d1-a58e-4ea8-aa14-108074b7b6f9}';//转换
{$EXTERNALSYMEncoderTransformation}
EncoderLuminanceTable:TGUID
='{edb33bce-0266-4a77-b904-27216099e717}';//亮度表
{$EXTERNALSYMEncoderLuminanceTable}
EncoderChrominanceTable:TGUID
='{f2e455dc-09b3-4316-8260-676ada32481c}';//色度表
{$EXTERNALSYMEncoderChrominanceTable}
EncoderSaveFlag:TGUID
='{292266fc-ac40-47bf-8cfc-a85b89a655de}';//保存标志
{$EXTERNALSYMEncoderSaveFlag}

也就是说我们可以在保存图像的同时,设置上述编码参数来满足我们的要求,如上面例子中分解图片时设置了质量参数;合成图像的时候设置了保存标志。但是很遗憾,不是每种图像编码器都支持上面参数的,如质量和转换参数就只有jpeg格式图像编码器支持,所以,如要用GDI+压缩图像旧只有JPEG格式才行。

编码参数的数据类型也是有规定的,具体定义和说明如下:

//---------------------------------------------------------------------------
//Imageencoderparameterrelatedtypes
//---------------------------------------------------------------------------

TEncoderParameterValueType
=(
EncoderParameterValueTypeByte
=1,//数组中的每个值都是8位无符号整数
EncoderParameterValueTypeASCII=2,//一个空终止的ASCII字符串,
//NumberOfValues包括NULL结束符在内的字符串长度
EncoderParameterValueTypeShort=3,//数组中的每个值都是16位无符号整数
EncoderParameterValueTypeLong=4,//数组中的每个值都是32位无符号整数
EncoderParameterValueTypeRational=5,//数组中的每一个值都是一对32位无符号整数,
//每一对都表示一个分数,
//第一个整数是分子,第二个整数是分母.
EncoderParameterValueTypeLongRange=6,//数组中的每一个值都是一对32位无符号整数,
//每一对都表示一个数字区域.
EncoderParameterValueTypeUndefined=7,//值的数组是没有定义数据类型的字节的数组
EncoderParameterValueTypeRationalRange=8//数组中的每一个值都是一组四个32位无符号整数,
//前两个整数表示一个分数,后两个整数表示第二个分数,
//这两个分数表示一个有理数区域,
//第一个分数是该区域中最小的有理数,
//第二个分数是该区域中最大的有理数.
);

从上面的类型说明可以看出,有些类型定义对参数值(Value)的规定很具体,你只有按要求给出才不会出错。有些参数我们可以给的值的范围较大,如例子中的品质参数,就可以在0 - 100之间;而还有些值则是规定好了的,如例子中的保存参数的值,下面也把这些值的枚举定义以及使用图像格式列在下面:

//---------------------------------------------------------------------------
//Imageencodervaluetypes
//---------------------------------------------------------------------------

TEncoderValue
=(
EncoderValueColorTypeCMYK,
EncoderValueColorTypeYCCK,
EncoderValueCompressionLZW,
//LZW压缩方案。可以作为属于压缩类别的参数传递到TIFF编码器。
EncoderValueCompressionCCITT3,//CCITT3压缩方案。可以作为属于压缩类别的参数传递到TIFF编码器。
EncoderValueCompressionCCITT4,//CCITT4压缩方案。可以作为属于压缩类别的参数传递到TIFF编码器。
EncoderValueCompressionRle,//RLE压缩方案。可以作为属于压缩类别的参数传递到TIFF编码器。
EncoderValueCompressionNone,//不指定压缩。可以作为属于压缩类别的参数传递到TIFF编码器。
EncoderValueScanMethodInterlaced,
EncoderValueScanMethodNonInterlaced,
EncoderValueVersionGif87,
EncoderValueVersionGif89,
EncoderValueRenderProgressive,
EncoderValueRenderNonProgressive,
EncoderValueTransformRotate90,
//图像将围绕其中心沿顺时针方向旋转90度。可以作为属于转换类别的参数传递到JPEG编码器
EncoderValueTransformRotate180,//图像围绕其中心旋转180度。可以作为属于转换类别的参数传递到JPEG编码器。
EncoderValueTransformRotate270,//图像围绕其中心沿顺时针方向旋转270度。可以作为属于转换类别的参数传递到JPEG编码器
EncoderValueTransformFlipHorizontal,//图像水平翻转。可以作为属于转换类别的参数传递到JPEG编码器。
EncoderValueTransformFlipVertical,//图像垂直翻转。可以作为属于转换类别的参数传递到JPEG编码器。
EncoderValueMultiFrame,//图像有多于1帧(页面)。可以作为属于保存标志类别的参数传递到TIFF编码器
EncoderValueLastFrame,//指定多帧图像中的最后一帧。可以作为属于保存标志类别的参数传递到TIFF编码器。
EncoderValueFlush,//应关闭一个多帧文件或流。可以作为属于保存标志类别的参数传递到TIFF编码器
EncoderValueFrameDimensionTime,
EncoderValueFrameDimensionResolution,
EncoderValueFrameDimensionPage
//将一帧添加到图像的页面维度。可以作为属于保存标志类别的参数传递到TIFF编码器。
);

没做说明的枚举值在GDI+ 1.0中是不支持的,其它也只适用规定的图像格式,如EncoderValueMultiFrame和EncoderValueFrameDimensionPage只适用于TIFF格式编码器,而EncoderValueFrameDimensionTime等值由不支持,所以,前面例子只能合成TIFF格式的多帧图像,而不能合成GIF格式。

关于多帧(页)图像可以参见我的文章《GDI+ 在Delphi程序的应用 -- 多帧(页)图像动画播放》。

我用的GDI+版本与网上流通不太兼容,可适当修改例子代码后测试,如需我的GDI+版本,请参照《GDI+ for VCL基础 -- GDI+ 与 VCL》的下载地址和说明,特别要注意后面的后记部分中需要修改的地方。

如有错误或建议,请来信:maozefa@hotmail.com,或者直接在文章中留言。

最后,例子中使用的GIF图像已经贴在了《GDI+ 在Delphi程序的应用 -- 多帧(页)图像动画播放》中,现做个图像地址连接:

分享到:
评论

相关推荐

    GDI++ for DELPHI

    GDI++ for DELPHI是一个专为DELPHI开发者设计的图形设备接口(GDI)扩展库,它提供了丰富的图形绘制功能,使开发者能够利用更高级的图形处理技术来增强应用程序的界面美观度和交互性。GDI++是基于Windows API的GDI...

    GDI+入门指导书------经典

    GDI+入门指导书------经典 非常适合于GDI+初学者

    在Delphi XE10.2版本可用的GDI+库

    在Delphi XE10.2版本中,开发者可以利用GDI+库来增强图形处理功能,提升应用程序的视觉效果。GDI+是Microsoft提供的一个图形设备接口,它基于GDI(Graphics Device Interface),但提供了更多的图形绘制和图像处理...

    GDI+图像程序设计(PDF & 源码 -电子工业出版社)

    ——在GDI+ Painter应用程序中添加颜色、钢笔和画笔 总结 第5章 颜色、字体和文本 5.1 访问Graphics对象 5.2 使用颜色 5.3 使用字体 5.4 使用文本和字符串 5.5 渲染文本的质量和性能 5.6 高级版式 5.7 一个...

    gdi++实现图像压缩-图像裁剪和缩放-图像格式转换-图像dpi修改.rar

    在Windows平台上,C++开发图形应用时,GDI++(也称为GDI+)是一个强大的图形库,它提供了丰富的功能,包括图像处理、绘制、文本渲染等。本压缩包文件包含的是利用GDI++实现的一些关键图像操作,如图像压缩、图像裁剪...

    GDI+ Delphi接口单元

    总的来说,GDI+ Delphi接口单元为Delphi开发者提供了一个强大而易用的工具,使他们能够充分利用GDI+的强大功能,创建出具有高质量图形和图像效果的应用程序。这个接口简化了与底层系统交互的过程,降低了开发复杂性...

    Delphi使用GDI+制作任意图片形状窗口

    为了实现上述功能,我们需要在Delphi中创建一个新的VCL Forms应用程序,然后导入GDI+的相关单元。在窗体的`OnCreate`事件中初始化GDI+,在`OnPaint`事件中绘制图片和处理透明度,在`OnNCCalcSize`事件中计算并设置...

    GDI+_for_VCL基础

    GDI+ for VCL基础是关于在Delphi和C++Builder中使用GDI+图形库进行图形绘制和图像处理的专题。GDI+是微软在Windows XP系统中引入的一个增强图形设备接口,它扩展了传统的GDI(Graphics Device Interface),提供了更...

    GDI+图形程序设计.zip

    GDI+提供了丰富的绘图功能,包括二维几何图形、曲线、文本、图像以及颜色管理等,使得开发者能够创建出具有高质量视觉效果的应用程序。 这本书《GDI+程序设计》显然是一个深入探讨GDI+技术的教程,它可能包含了GDI+...

    delphi gdi+遮罩动画字

    在本文中,我们将深入探讨如何在Delphi编程环境中利用GDI+库来创建遮罩动画文字效果。Delphi是一款强大的Windows应用程序...通过不断的实践和学习,可以更好地掌握GDI+在Delphi中的应用,为应用程序增添更多视觉魅力。

    Delphi GDI+

    Delphi GDI+是Delphi开发者用于构建高质量图形用户界面的强大工具集,它通过提供矢量图形、位图处理、文字渲染、颜色管理和图形变换等功能,极大地扩展了原生GDI的功能,帮助开发者创建出更为美观且功能丰富的应用...

    GDI+程序设计 GDI+程序设计 GDI+程序设计 GDI+程序设计

    GDI+(Graphics Device Interface Plus)是微软Windows操作系统中用于图形设备接口的增强版本,它为开发者提供了一套丰富的绘图工具,使得在Windows应用程序中创建、管理和显示图形变得更加便捷和高效。GDI+不仅继承...

    delphi 与 GDI+

    《Delphi与GDI+深度探索》 在编程领域,Delphi是一款强大的对象 Pascal 编程工具,以其高效、易用而备受开发者喜爱。而GDI+(Graphics Device Interface Plus)是微软推出的一种图形设备接口,它扩展了传统的GDI...

    GDI+库ForDelphi2010

    DephiXE2之后的开发可以直接通过uses GDIPAPI, GDIPOBJ,来使用GDI+开发。 而Delphi7和Delphi2010没有这两个文件。 通过百度查找,GDIPlus1.2提供的是GDIPlus, GDIPlusHelpers。这样必然导致XE的代码需要进行调整...

    Delphi使用GDI实现图像镜像翻转

    Delphi作为流行的Windows应用程序开发工具,其VCL库与GDI接口紧密结合,使得开发者能够方便地利用GDI的功能。 首先,我们要理解图像翻转的原理。图像的镜像翻转主要有两种类型:水平翻转(也称为左右翻转)和垂直...

    GDI+程序设计(清华大学)

    第四部分则着重介绍了GDI+功能在Web应用程序中的应用,如在互联网上提供GDI+图像、创建***服务器控件和使用GDI+创建Web服务等。 本书对GDI+的讲解从浅入深,逐步引导读者掌握图形编程的关键技能。其中对于自定义...

    ( Delphi 7 )使用GDI+进行图形缩放、拖动,多种图片格式支持,仅简单示例

    使用GDI+进行图形缩放、拖动,多种图片格式支持,仅简单示例。 问题源贴:http://bbs.csdn.net/topics/390638094

    GDI+图形程序设计

    GDI+(Graphics Device Interface Plus)是微软为Windows应用程序提供的一种强大的图形处理库,它扩展了原有的GDI(Graphics Device Interface),增加了更多的图形绘制功能和更丰富的API接口,使得开发者能够创建出...

    delphi基于gdi+的图片旋转任意角度

    1. **Delphi与GDI+的集成**:Delphi支持使用.NET Framework的类库,包括GDI+。开发者可以通过引入System.GDIPlus单元来访问GDI+的接口,实现各种图形操作,如绘制、填充、旋转、缩放等。 2. **TGPBitmap类**:这是...

    c++ GDI,C++Builder GDI,GDI,Png,Png to Image,支持多种图片格式,能够在多种图片间进行转换(bmp,jpg,wmf,emf,png,gif)

    GDI+ for VCL 是一个基于 GDI+ 的图形处理库,专门为 C++ Builder 和 Delphi 开发环境设计,提供了许多实用的图形处理函数和类库,帮助开发者快速开发图形相关的应用程序。 GDI+ for VCL 基础 -- 图像显示辅助类 ...

Global site tag (gtag.js) - Google Analytics