【视频开发】非常优秀的CxImage各种格式图像开源工具

下面介绍应用它进行图像类型转换的方式:

1.从一种图像文件类型转换为另一种文件类型(convert from a format to another)

  CxImage   image;     //  定义一个CxImage对象

  //  从bmp文件转换为jpg文件(bmp -> jpg) 
  image.Load(  "  image.bmp  "  , CXIMAGE_FORMAT_BMP);     //  先装载bmp文件,需要指定文件类型
    
  //  判断加载的bmp文件是否存在。 
  if  (image.IsValid())...  {
       
  //  Returns true if the image has 256 colors   and a linear grey scale palette. 
        if  (  !  image.IsGrayScale()) image.IncreaseBpp(  24  );     //  param nbit: 4, 8, 24 
       image.SetJpegQuality(  99  );                  //  设置图像的压缩质量参数(从0到100,数值越大,质量越高) 
       image.Save(  "  image.jpg  "  ,CXIMAGE_FORMAT_JPG);            //  把压缩后的图像以jpg文件类型保存起来。 
  } 

 

  //  从png文件转换为tif文件(png -> tif) 
  image.Load(  "  image.png  "  , CXIMAGE_FORMAT_PNG);
  if  (image.IsValid())  {
     image.Save(
  "  image.tif  "  ,CXIMAGE_FORMAT_TIF);
}

 

2。加载程序资源图像(load an image resource)

即从程序的资源图像中构建CxImage对象,有如下几种方式:

 

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

 

3。在内存缓冲中的图像类型转换

(1)把内存缓冲中的数据解码成一个Image对象(decode an image from memory)

有如下几种方式:
------

  CxImage image((BYTE  *  )buffer,size,image_type);  //  把内存缓冲buffer中的数据构造成Image对象

  //  或: 
 
CxMemFile memfile((BYTE
  *  )buffer,size);  //  显式使用CxMemFile对象 
  CxImage image(  &  memfile,image_type);

  //  或: 
 
CxMemFile memfile((BYTE
  *  )buffer,size);
CxImage
  *  image  =  new  CxImage();
image
  ->  Decode(  &  memfile,type);

 

============

(2)把Image编码存放到内存缓冲中(encode an image in memory)

--------

  long  size  =  0  ;  //  得到图像大小 
  BYTE  *  buffer  =  0  ;  //  存储图像数据的缓冲 
  image.Encode(buffer,size,image_type);  //  把image对象中的图像以type类型数据copy到buffer 
  ...
free(buffer);

或:

CxMemFile memfile;            
  //  显式使用CxMemFile对象 
  memfile.Open();
image.Encode(
  &  memfile,image_type);
BYTE
  *  buffer  =  memfile.GetBuffer();
  long  size  =  memfile.Size();
...
free(buffer);

 

 

 

4。处理系统粘贴板中的图像(copy/paste an image)

 

 

  //  copy(到粘贴板) 
  HANDLE hDIB  =  image  ->  CopyToHandle();
  if  (::OpenClipboard(AfxGetApp()  ->  m_pMainWnd  ->  GetSafeHwnd()))  {
    
  if  (::EmptyClipboard())  {
        
  if  (::SetClipboardData(CF_DIB,hDIB)  ==  NULL )  {
             AfxMessageBox( 
"  Unable to set Clipboard data  "  );
}
       }       } 
CloseClipboard();

  //  paste(从粘贴板粘贴出来) 
  HANDLE hBitmap  =  NULL;
CxImage 
*  newima  =  new  CxImage();
  if  (OpenClipboard()) hBitmap  =  GetClipboardData(CF_DIB);
  if  (hBitmap) newima  ->  CreateFromHANDLE(hBitmap);
CloseClipboard();

 

 

5。在picture box中显示一个png格式的文件

 

 

  HBITMAP m_bitmap  =  NULL;
CxImage image(
  "  myfile.png  "  , CXIMAGE_FORMAT_PNG);
...
m_bitmap 
=  image.MakeBitmap(m_picture.GetDC()  ->  m_hDC);
m_picture.SetBitmap(m_bitmap);
...
  if  (m_bitmap) DeleteObject(m_bitmap);

 

 


四。其它

一 个CxImage对象是一个扩展了的位图。作者只是在位图结构上添加了一些起存储信息作用的成员变量。一个CxImage对象(同时)也是一组层。每个层 只有在需要时才会分配相应的缓冲区。CxImage::pDib代表着背景图像,CxImage::pAlpha代表着透明层,CxImage:: pSelection代表着被选中的层,被用来创建图像处理时让用户感兴趣的区域。在这三个特殊层面的基础上,你可以增加一些额外的层,这些层可以存储在 CxImage::pLayers中。一般说来,层是一个完整的CxImage对象。因此,你可以构造很复杂的嵌套层。下面是CxImage的一些成员变 量:

 

 

  class  CxImage
  {
...
  protected  :
  void  *  pDib;              //  包含文件头,调色板等等 
  BITMAPINFOHEADER head;  //  标准的文件头(位图) 
  CXIMAGEINFO info;        //  扩展了的信息 
  BYTE  *  pSelection;        //  用户选中的区域 
  BYTE  *  pAlpha;            //  alpha通道 
  CxImage  **  pLayers;       //  通用层 
  } 
typedef 
struct  tagCxImageInfo  {
DWORD    dwEffWidth;       
  //  DWORD 扫描线宽 
  BYTE  *      pImage;             //  图像位数 
  void  *      pGhost;             //  if this is a ghost, pGhost point to the body 
  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通道则为真 
  bool       bEnabled;           //  打开绘图函数 
  long       xOffset;
  long       yOffset;
DWORD    dwEncodeOption;   
  //  一些编码选项 
  RGBQUAD last_c;             //  一些优化选项 
  BYTE     last_c_index;
  bool       last_c_isvalid;
  long       nNumLayers;
DWORD    dwFlags;
}
  CXIMAGEINFO;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值