主页C++ Builder 资料C++ Builder 参考手册Pictures 图片TPngImage
C++ Builder 串口控件
C++ Builder 编程技巧
C++ Builder 操作指南
C++ Builder 参考手册
基础知识
cfloat 浮点数
cmath 数学函数
cstdlib 标准库函数
System 字符串
System 日期和时间
System.Math.hpp 数学函数
其他数据类型
VCL 基础类
VCL 应用程序
Pictures 图片
 • TBitmap
 • TGIFImage
 • TGraphic
 • TIcon
 • TJPEGImage
 • TMetafile
 • TPicture
 • TPngImage
 • TWICImage
Graphics 绘图
Additional 控件
System 控件
A ~ Z 字母顺序排列的目录
网友留言/技术支持
TPngImage - .png 图片,支持 Alpha 通道 (半透明)

说明:

TPngImage: .png 图片,支持 Alpha 通道 (半透明)

 

头文件:

#include <Vcl.Imaging.pngimage.hpp> (XE2 之后),#include <pngimage.hpp> (XE 之前)

 

继承关系:

TObjectTPersistentTInterfacedPersistentTGraphicTPngImage

 

属性:

属性 类型 描述
public:    
TransparentColor TColor 这个颜色的部分显示为透明,可读写属性。
如果 png 图像包含 Alpha 通道,这个属性无效;
如果 png 图像不包含 Alpha 通道,设置这个属性会引起 TransparencyMode 属性变为 ptmBit。
Scanline void * [const int Index] 第 Index 行图像数据。读取 16 位像素数据的时候,Scanline 属性得到的是每个像素的前 8 位数据,ExtraScanline 属性得到的是每个像素的后 8 位数据。
ExtraScanline void * [const int Index] 第 Index 行图像数据。读取 16 位像素数据的时候,Scanline 属性得到的是每个像素的前 8 位数据,ExtraScanline 属性得到的是每个像素的后 8 位数据。
PixelInformation TChunkpHYs * 返回包含像素信息的块对象。如果 png 图像数据里面不包含像素信息块,读取这个属性会在 png 图像里面增加一个默认的像素信息块,所以需要使用 HasPixelInformation 方法来获取 PixelInformation 属性是否包含像素信息块的数据。
AlphaScanline pByteArray [const int Index] 如果 png 图像包含 Alpha 通道,这个属性返回第 Index 行像素的 Alpha 值。
Canvas TCanvas png 图像的画布,可以通过这个画布来读取和修改 png 图像。
Header TChunkIHDR * png 图像的文件头信息。这个属性由 TPngImage 内部使用,不建议使用这个属性。
TransparencyMode TPNGTransparencyMode 图像透明方式,只读属性。可用的值:
ptmNone: 不支持透明;
ptmBit: 指定透明部分的颜色。没有 Alpha 通道的 png 图像,使用 TransparentColor 属性指定透明部分的颜色;
ptmPartial: 支持半透明,png 图像包含 Alpha 通道。
Width int 图像的宽度,可读写,单位:像素 (pixels)
可以用 SetSize 方法同时修改宽度和高度
Height int 图像的高度,可读写,单位:像素 (pixels)
可以用 SetSize 方法同时修改宽度和高度
InterlaceMethod TInterlaceMethod 隔行交错存储的方式,可读写属性,可用的值为:
imNone: 不使用隔行交错存储方式;
imAdam7: 使用 Adam7 算法。
Filters TFilters 压缩生成 png 数据使用的过滤器,可读写属性,可用的值为:
pfNone: 不实用过滤器,直接存储每行数据;
pfSub: 使用 Sub algorithm
pfUp: 使用 Up algorithm
pfAverage: 使用 Average algorithm
pfPaeth: 使用 Paeth algorithm
MaxIdatSize int 图像数据块 (IDAT, image data chunk) 的最大容量,可读写属性。
这个属性在应用程序里面不使用,它控制可变的图像信息。
Empty bool 是否包含图像数据,只读。如果不包含图像数据,此属性为 true.
CompressionLevel TCompressionLevel 压缩等级,可读写属性,范围:0 ~ 9。
0: 不压缩,9: 最大压缩率。
Chunks TPNGList png 图像数据块,TPngImage 内部使用的属性,不建议使用。
Pixels TColor [const int X][const int Y] 图像 x, y 位置的像素的颜色,可读写属性。
Version UnicodeString 支持 png 的版本,应用程序不要依赖这个版本号确定功能。
GammaTable StaticArray<System::Byte, 256> System::StaticArray<System::Byte, 256> GammaTable;
这是一个数据成员,TPngImage 内部使用的数据。
TGraphic::   TGraphic 继承过来的
Modified bool 图像是否被修改过。如果被修改过,此属性为 true.
Palette HPALETTE 调色板句柄,可读写。如果图片没有或者不需要调色板,此值为 NULL
PaletteModified bool 调色板是否被修改过,如果被修改过,此属性值为 true.
Transparent bool 图像是否存在透明部分,可读写。
SupportsPartialTransparency bool 是否支持半透明或 Alpha 通道,只读属性。
protected:    
InverseGamma StaticArray<System::Byte, 256> System::StaticArray<System::Byte, 256> InverseGamma;
这是一个数据成员,TPngImage 内部使用的数据。
BeingCreated bool bool BeingCreated;
这是一个数据成员,TPngImage 内部使用的数据。正在从文件或流读取和解析数据的时候,这个数据的值为 true.

 

方法:

方法 描述
public:  
TPngImage __fastcall virtual TPngImage(void);
__fastcall TPngImage(unsigned ColorType, unsigned Bitdepth, int cx, int cy);
构造函数。
ColorType 和 Bitdepth 必须使用下面表格里面的数据,否则会抛出异常,cx 和 cy 为图像的宽度和高度。
ColorType Bitdepth Exception
COLOR_GRAYSCALE, COLOR_RGB, COLOR_PALETTE,
COLOR_GRAYSCALEALPHA, COLOR_RGBALPHA
1, 2, 4, 8, 16
COLOR_PALETTE 16
COLOR_RGB <8
~TPngImage __fastcall virtual ~TPngImage(void);
析构函数。
Resize void __fastcall Resize(const int CX, const int CY);
改变 png 图像的大小为:宽度:CX,高度:CY
CreateAlpha void __fastcall CreateAlpha(void);
给当前的 png 图像添加 Alpha 通道,新增的 Alpha 通道所有的 Alpha 值都初始化为 255,即完全不透明。
RemoveTransparency void __fastcall RemoveTransparency(void);
删除 png 图像的 Alpha 通道和数据。
AddtEXt void __fastcall AddtEXt(const System::AnsiString Keyword, const System::AnsiString Text);
给 png 图像的中继数据里面添加一对原文文字存储的关键字和关键字的值。
AddzTXt void __fastcall AddzTXt(const System::AnsiString Keyword, const System::AnsiString Text);
给 png 图像的中继数据里面添加一对压缩文字存储的关键字和关键字的值。
SaveToClipboardFormat virtual void __fastcall SaveToClipboardFormat(System::Word &AFormat, NativeUInt &AData, HPALETTE &APalette);
把当前的图像数据转为剪贴板格式的数据,可以把这些数据放入剪贴板。
【请参考 TBitmap 的例子:把位图放在剪贴板里面
LoadFromClipboardFormat virtual void __fastcall LoadFromClipboardFormat(System::Word AFormat, NativeUInt AData, HPALETTE APalette);
从剪贴板加载图像数据,AFormat 为剪贴板数据格式,例如 CF_BITMAP,AData 为图像数据,APalette 为调色板句柄。【请参考 TBitmap 的例子:从剪贴板加载位图
RaiseError void __fastcall RaiseError(System::Sysutils::ExceptClass ExceptionClass, System::UnicodeString Text);
产生一个错误异常,由 TPngImage 内部调用的,应用程序不要调用这个方法。
HasPixelInformation bool __fastcall HasPixelInformation(void);
获取 PixelInformation 属性是否包含像素信息块的数据。
DrawUsingPixelInformation void __fastcall DrawUsingPixelInformation(Vcl::Graphics::TCanvas* Canvas, const System::Types::TPoint &Point);
根据 PixelInformation 像素信息把 png 图像输出到画布。
Assign virtual void __fastcall Assign(System::Classes::TPersistent* Source);
把 Source 里面的图像数据赋值 (格式转换) 到当前图像。
AssignTo virtual void __fastcall AssignTo(System::Classes::TPersistent* Dest);
把当前图像数据赋值 (格式转换) 到 Dest 的图像数据。
AssignHandle void __fastcall AssignHandle(HBITMAP Handle, bool Transparent, unsigned TransparentColor);
把 Handle 句柄的位图数据拷贝到当前图像数据,如果 Transparent 为 true,图像的 TransparentColor 颜色的部分变为透明。
Draw virtual void __fastcall Draw(Vcl::Graphics::TCanvas* ACanvas, const System::Types::TRect &Rect);
把 png 图像输出到画布的 Rect 位置,使用透明选项,但是会忽略 PixelInformation 像素信息。
如果要使用像素信息,需要用 DrawUsingPixelInformation 方法。
LoadFromStream virtual void __fastcall LoadFromStream(System::Classes::TStream* Stream);
从流加载图像。
SaveToStream virtual void __fastcall SaveToStream(System::Classes::TStream* Stream);
把图像数据保存到流。
LoadFromResourceName void __fastcall LoadFromResourceName(NativeUInt Instance, const System::UnicodeString Name);
通过资源名称从资源里面加载图像。
LoadFromResourceID void __fastcall LoadFromResourceID(NativeUInt Instance, int ResID);
通过资源 ID 从资源里面加载图像。
TGraphic:: TGraphic 继承过来的
Equals virtual bool __fastcall Equals(System::TObject* Obj);
比较当前图像是否和 Obj 的图像数据相同。
LoadFromFile virtual void __fastcall LoadFromFile(const System::UnicodeString Filename);
从文件加载图像。
SaveToFile virtual void __fastcall SaveToFile(const System::UnicodeString Filename);
把当前图像储存为文件。
SetSize virtual void __fastcall SetSize(int AWidth, int AHeight);
修改图像的大小为:宽度 = AWidth,高度 = AHeight,单位为像素 (pixels)
operator
_di_IStreamPersist()
operator System::Classes::_di_IStreamPersist()
{
  System::Classes::_di_IStreamPersist intf;
  this->GetInterface(intf);
  return intf;
}
类型转换操作符,转为 _di_IStreamPersist 类型。
protected:  
InitializeGamma void __fastcall InitializeGamma(void);
TPngImage 内部调用的方法,应用程序不要调用。
GetSupportsPartialTransparency virtual bool __fastcall GetSupportsPartialTransparency(void);
返回是否支持半透明或 Alpha 通道。
GetPalette virtual HPALETTE __fastcall GetPalette(void);
返回调色板句柄。
SetPalette virtual void __fastcall SetPalette(HPALETTE Value);
调色板改为使用 Value 句柄的调色板。
DoSetPalette void __fastcall DoSetPalette(HPALETTE Value, const bool UpdateColors);
TPngImage 内部调用的方法,设置调色板的颜色,并且更新所有相关的数据。
应用程序可以用 Palette 属性访问调色板。
GetWidth virtual int __fastcall GetWidth(void);
返回图像的宽度,单位:像素 (pixels)。
GetHeight virtual int __fastcall GetHeight(void);
返回图像的高度,单位:像素 (pixels)。
SetWidth virtual void __fastcall SetWidth(int Value);
把图像宽度修改为 Value,单位:像素 (pixels)
SetHeight virtual void __fastcall SetHeight(int Value);
把图像高度修改为 Value,单位:像素 (pixels)
AssignPNG void __fastcall AssignPNG(TPngImage* Source);
TPngImage 内部调用的方法,把 Source 的数据都复制到当前图像数据。
GetEmpty virtual bool __fastcall GetEmpty(void);
返回图像数据是否为空。
GetHeader TChunkIHDR* __fastcall GetHeader(void);
Header 属性使用这个方法来获取数据。这个属性由 TPngImage 内部使用,不建议使用这个属性。
DrawPartialTrans void __fastcall DrawPartialTrans(HDC DC, const System::Types::TRect &Rect);
使用半透明属性把 png 图像输出到 DC,只有图像包含半透明数据,这个函数才可以工作。
GetTransparent virtual bool __fastcall GetTransparent(void);
返回图像是否存在透明部分。
GetPixels virtual System::Uitypes::TColor __fastcall GetPixels(const int X, const int Y);
返回 X, Y 位置的像素的颜色。
SetPixels virtual void __fastcall SetPixels(const int X, const int Y, const System::Uitypes::TColor Value);
把 X, Y 位置的像素的颜色设置为 Value
TGraphic:: TGraphic 继承过来的
Changed virtual void __fastcall Changed(System::TObject* Sender);
当图像数据被修改的时候,会自动调用 Changed 方法。
Changed 方法会把 Modified 属性置为 true,并且触发 OnChange 事件。
DefineProperties virtual void __fastcall DefineProperties(System::Classes::TFiler* Filer);
重载 TPersistent 的 DefineProperties,用于 ReadData 和 WriteData 方法读写流图像数据。
Draw virtual void __fastcall Draw(TCanvas* ACanvas, const System::Types::TRect &Rect) = 0 ;
把当前图像数据显示到画布 ACanvas 的 Rect 位置。
DrawTransparent virtual void __fastcall DrawTransparent(TCanvas* ACanvas, const System::Types::TRect &Rect, System::Byte Opacity);
把当前图像数据显示到画布 ACanvas 的 Rect 位置,和画布 Rect 位置原来的显示内容混合在一起,Opacity 为混合的比例,用来实现图像的透明效果,即 Opacity 为图像不透明的程度。
Equals HIDESBASE virtual bool __fastcall Equals(TGraphic* Graphic)/* overload */;
比较当前图像是否和 Obj 的图像数据相同。
Progress DYNAMIC void __fastcall Progress(System::TObject* Sender, TProgressStage Stage, System::Byte PercentDone, bool RedrawNow, const System::Types::TRect &R, const System::UnicodeString Msg);
当图像改变时 (加载、存储、转换的过程中),会调用这个方法来触发 OnProgress 事件。
ReadData virtual void __fastcall ReadData(System::Classes::TStream* Stream);
从 Stream 里面读取图像数据。
SetTransparent virtual void __fastcall SetTransparent(bool Value);
设为是否需要把图像显示为透明。
WriteData virtual void __fastcall WriteData(System::Classes::TStream* Stream);
把图像数据写到 Stream 里面

 

事件:

事件 描述
public:  
TGraphic:: TGraphic 继承过来的
OnChange __property System::Classes::TNotifyEvent OnChange = {read=FOnChange, write=FOnChange};
• 当加载的图像发生变化时产生的事件,如果正在显示这个图片,需要刷新显示。
• 对于 gif 动画,需要显示下一帧的时候,会产生这个事件,需要在这个事件里面刷新显示
例:直接在画布上显示 gif 动画
OnProgress __property TProgressEvent OnProgress = {read=FOnProgress, write=FOnProgress};
当加载、存储、转换的过程中,会产生这个事件,表示这个过程的进度。

 

相关链接:

jpg, gif, png, bmp 之间的格式转换
bmp 转 gif 图片和动画
显示 gif 图片和动画
gif 的每一帧提取出来,每一帧存为一个 bmp 图片
屏幕截图

◤上一页:TPicture下一页:TWICImage

C++ 爱好者 -- Victor Chen 的个人网站 www.cppfans.com 辽ICP备11016859号