本文共 2839 字,大约阅读时间需要 9 分钟。
CImage类的成员可分为连接与创建、输入与输出、位图类型与参数,以及图形绘制与位图块传送等4类。
(1) 连接与创建Attach 将一个DIB(或DDB)位图与CImage对象相连接Detach 位图与CImage对象相分离Create 创建一个DIB位图并将它与已有CImage对象相连接Destroy 位图与Cimage对象相分离并删除(2) 输入与输出GetImporterFilterString 返回系统支持的输入文件格式类型及其描述GetExporterFilterString 返回系统支持的输出文件格式类型及其描述Load 读入指定图像文件中的图像LoadFromResource 读入指定资源文件中的图像Save 按指定类型保存图像,文件名中不能省略后缀IsNull 判别源图像文件是否已经读入(3) 位图类型与参数GetWidth 返回当前图像的宽度(以像素为单位)GetHeight 返回当前图像的高度GetBPP 返回当前图像的每像素位数GetBits 返回当前图像像素数据的指针GetPitch 返回相邻两行像素首地址之间的间隔GetPixelAddress 返回指定像素数据存放位置的存储地址GetMaxColorTableEntries返回调色板单元数IsDibSection 确定位图是否为DIB位图IsIndexed 判别位图中是否有调色板IsTransparencySupported判别应用程序是否支持透明位图AlphaBlend 是否支持透明或半透明显示的状态(4) 图形绘绘与位图块传送GetDC 返回当前位图的设备描述表ReleaseDC 释放设备描述表GetPixel 返回指定位置像素的颜色SetPixel 设置指定位置像素的颜色SetPixelIndexed 设置指定位置像素颜色的索引值SetPixelRGB 设置指定位置像素的红绿蓝分量GetColorTable 获取调色板颜色分量(红、绿、蓝)值SetColorTable 设置调色板颜色分量(红、绿、蓝)值SetTransparentColor 设置透明颜色的索引值,只能有一种颜色可为透明Draw 从源矩形复制到目标矩形,支持伸缩、a融合与透明BitBlt 位图的一个举行区域复制到另一位图上的制定区域MaskBlt 为图块传送时须与指定的模板图像做逻辑操作PlgBlt 为图的矩形区域到另一位图上平行四边形间的位块传输StretchBlt 从源矩形复制到目标矩形,支持伸缩TransparentBlt 位图块传送时复制带透明色的位图 FAQ: 1. 关于GetBits()函数的使用.对于一幅DIB图像来说,图像的左下角为像素数据的起点。通常我们会认为GetBits()函数返回的是图像左下角的数据指针,但是CImage实现却不是这样。GetBits()返回的是图像左上角的像素数据指针。从这个角度上来讲,它的功能等效于函数GetPixelAddress(0,0)调用。而且CImage的成员函数中坐标是以左上角为坐标原点来表示的。2. 关于SetPixelIndexed()函数的使用. 从函数名我们可以得知,该函数应该应用于非真彩色图像,特别是8位的图像。在测试该函数时,发现应用于8位BMP图像时,不管设置什么索引值,操作后的结果显示索引值变成了0。这个现象确实让人匪夷所思。不知道是不是CImage类的该函数设计有问题。当然,如果将它不合理地应用于真彩色图像,操作的结果还是黑色。
3. 另外,CImage类中还有一些函数,譬如SetPixel()和SetPixelRGB()函数,理论上应该将它们应用于真彩色图像,但是如果强硬的将它们应用于非真彩色图像(测试中将它们应用于8位BMP图像),操作结果显示设置的值都会被“合理”的变成灰阶数据,比如说,如果我们设置RGB值为(180,0,0),操作结果为调色板里的数据变为RGB(60,60,60).
4. 直接调用CImage类的GetPixel和SetPixel效率是很低的, 如果要循环遍历所有Pixels的话, 需要用GetPixelAddress直接取得像素数据的存储地址, 然后进行操作。这种方法有个问题: How to handle the PixelAddresses correctly with diffrent kinds of BPPs (Bits Per Pixel). For 24 BPP Images: for setting inline void setPixel(int x, int y, COLORREF &c) { BYTE *p = (BYTE*)imgage.GetPixelAddress(x, y); *p++ = GetRValue(c); *p++ = GetGValue(c); *p = GetBValue(c); } & for getting a pixel inline COLORREF getPixel(int x, int y) const { return(*(COLORREF*)(image.GetPixelAddress(x, y))); } For 16 BPP Images: 16-bit images would be easy to support, and they are much similar to 32-bit images. 16-bit colour pixels are stored in 5-6-5 format (five bits for red, six bits for green, and five for blue). inline void setPixel(int x, int y, COLORREF &c) { WORD *p = (WORD*)imgage.GetPixelAddress(x, y); *p = ((GetRValue(c) >> 3) << 11) + ((GetGValue(c) >> 2) << 5) + (GetBValue(c) >> 3); } inline COLORREF getPixel(int x, int y) const { WORD *p = (WORD*)image.GetPixelAddress(x, y); return RGB(((*p & 0xF800) >> 8), ((*p & 0x07E0) >> 3), ((*p & 0x001F) << 3)); } Ref:转载地址:http://bczvb.baihongyu.com/