cximage图像的数据时从下到上,从左到右,
而opecv里的Mat数据类型是从下到上,从左到右的存储,使用的时候需要转换
RGBQUAD 是一个表示32bit像素值的结构体。
待整理...........................
CxImage库的结构
在整个库的继承树中,CxImage位于所有其他模块的顶部。这不是一个完全的符合OOP的方式,但是至少从最初的版本一直到现在,它都工作得很好。现在想要改变整个结构,已经太晚了。但是,你总是可以使用这些继承类来操作相应格式的图像,例如你可以使用CxImageTIF来保存多页的TIFF文件。这样显得非常直观。
连接所有模块和C库的是CxFile。这是一个虚类,它提供了标准的方法,用于访问硬盘或者内存的文件数据。
CxImage的继承树
一个CxImage对象基本上对应于一副位图,同时添加了一些额外的成员变量用于存储一些有用的信息。
class CxImage { ... protected: void* pDib; //包含文件头,调色板和像素数据 BITMAPINFOHEADER head; //标准文件头 CXIMAGEINFO info; //扩展信息 BYTE* pSelection; //选区 BYTE* pAlpha; //alpha通道 CxImage** ppLayers; //普通层 CxImage** ppFrames; //动画的帧 } CxImage::head 是位图文件的文件头,而CxImage::pDib就是一个普通的位图(就像你在CxImageBMP::Encode中看到的一样)。 CxImage::info 是一个方便的信息容器。这些信息被不同的文件格式所共享,同时供所有成员函数访问。 typedef struct tagCxImageInfo { DWORD dwEffWidth; //双字节对齐宽度 BYTE* pImage; //图像数据 void* pGhost; //如果这是一个备份(ghost), //则pGhost指向它的原始对象 DWORD dwType; //原始图像格式 char szLastError[256]; //调试信息,最后的错误信息 long nProgress; //进度 long nEscape; //取消 long nBkgndIndex; //GIF, PNG, MNG使用 RGBQUAD nBkgndColor; //RGB透明使用 BYTE nQuality; //JPEG使用 long nFrame; //TIF, GIF, MNG使用,表示当前活动帧 long nNumFrames; //TIF, GIF, MNG使用,表示总帧数 DWORD dwFrameDelay; //GIF, MNG使用,表示帧的延迟 long xDPI; //水平分辨率 long yDPI; //垂直分辨率 RECT rSelectionBox; //对象的外包围框 BYTE nAlphaMax; //最大透明度 bool bAlphaPaletteEnabled; //如果调色板中的alpha值是启用的, //则这个变量为true bool bEnabled; //启用绘制函数 long xOffset; long yOffset; DWORD dwEncodeOption; //GIF, TIF使用: // 0=def.1=unc,2=fax3,3=fax4, // 4=pack,5=jpg RGBQUAD last_c; //用于优化GetNearestIndex BYTE last_c_index; bool last_c_isvalid; long nNumLayers; DWORD dwFlags; } CXIMAGEINFO;
示例: 如何转换一种格式到另外一种格式
CxImage image; // bmp -> jpg image.Load("image.bmp", CXIMAGE_FORMAT_BMP); if (image.IsValid()){ if(!image.IsGrayScale()) image.IncreaseBpp(24); image.SetJpegQuality(80); image.Save("image.jpg",CXIMAGE_FORMAT_JPG); } // png -> tif image.Load("image.png", CXIMAGE_FORMAT_PNG); if (image.IsValid()){ image.Save("image.tif",CXIMAGE_FORMAT_TIF); }
如何从资源中加载图像
//Load the resource IDR_PNG1 from the PNG resource type CxImage* newImage = new CxImage(); newImage->LoadResource(FindResource(NULL,MAKEINTRESOURCE(IDR_PNG1), "PNG"),CXIMAGE_FORMAT_PNG); 或者 //Load the resource IDR_JPG1 from DLL CxImage* newImage = new CxImage(); HINSTANCE hdll=LoadLibrary("imagelib.dll"); if (hdll){ HRSRC hres=FindResource(hdll,MAKEINTRESOURCE(IDR_JPG1),"JPG"); newImage->LoadResource(hres,CXIMAGE_FORMAT_JPG,hdll); FreeLibrary(hdll); } 或者 //Load a bitmap resource; HBITMAP bitmap = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP1))); CxImage *newImage = new CxImage(); newImage->CreateFromHBITMAP(bitmap);
如何在图片框控件(Picture Box)中显示图像
HBITMAP m_bitmap = NULL; CxImage image("myfile.png", CXIMAGE_FORMAT_PNG); ... CDC* hdc = m_picture.GetDC(); HBITMAP m_bitmap = image.MakeBitmap(hdc->m_hDC); HBITMAP hOldBmp = m_picture.SetBitmap(m_bitmap); if (hOldBmp) DeleteObject(hOldBmp); if (hdc->m_hDC) m_picture.ReleaseDC(hdc); ... if (m_bitmap) DeleteObject(m_bitmap);