CxImage库----整理

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的不同层
  CxImage对象同样是图层的集合,每个图层的缓冲区只在需要的时候申请。
  CxImage::pDib是背景图像。 CxImage::pAlpha是透明层。CxImage::pSelection是选区层,用于创建要对图像的感兴趣区域进行处理的选择区域。在这三个特殊层之上,你可以添加通用的其他层,这些层都保存在CxImage::ppLayers中。通用层也是完整的CxImage对象,所以你可以创建复杂的嵌套层。CxImage::ppFrames 为动态图像(GIF)所预留。 

示例: 如何转换一种格式到另外一种格式 

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);


 



你可能感兴趣的:(CxImage库----整理)