CxImage是免费开源的使用简单的图形处理程序,在这里演示了两个功能。

1 在对话框上加一按钮,其函数为将BMP位图转换成TIF和JPEG。

2 在对话框上加一按钮,抓屏为BMP位图,通过剪切板保存为JPG文件。

一 CxImage简单使用说明

大部分内容来自网上,做了适当地改进。

CxImage是免费开源的C++图形软件,支持BMP、GIF、ICO、TGA、JPEG、PCX、PNG、TIFF、MNG、RAS等文件格式,能够实现图像的导入、保存、显示,以及几何变换、格式转换,也可实现内存图像数据的类型转换。

CxImage的主要函数有:Constructors  构造函数,Initialization  初始化,File 文件编解码,Generic 图像基本变化,DSP 图像处理操作,Painting 绘图操作,Multiple Images 多帧图像操作,Transparency 透明层操作,Palette 调色板操作,Pixels 像素操作,Region Selection 区域选择操作,Alpha Channel Alpha通道操作,Layers 图像层操作,Attributes 图像属性操作,Miscellaneous 杂项等。

CxImage使用

1. 下载CxImage的源代码
可以到作者 Davide Pizzolato 主页: http://www.xdp.it/,或者http://www.codeproject.com/bitmap/CXImage.asp,http://www.codeproject.com/KB/graphics/cximage.aspx下载CxImage的源代码和完整Demo。可能需要先注册一个 codeproject的免费账号 。

2. 编译CxImage。
解压源码包,在解压后的目录下有一个CxImageLib.dsw工作空间文件,使用VC++ 6.0 打开该工作空间文件:
① Project->Settings->C/C++,在Category下拉列表中选择Code Generation,将Use rum-time libary中选择MultiThread DLL.在 Category下拉列表中选择 Precompiled Headers中,选择第一项: Not using Precompiled headers.
② Build->Batch Build->勾选你要编译的版本库。默认情况下是每个库都有四个版本,分别是Debug、Release、Unicode Debug、Unicode Release.选择你想要的版本,比如只勾选Debug即可。
③ 执行全部编译,等待几分钟,生成几个lib。

3. 建立自己的测试工程
① 打开VC++6.0,新建基于对话框的程序TestImg。

3.1 在对话框上加一按钮,其函数为将BMP位图转换成TIF和JPEG。
void CTestImgDlg::OnButton1()
{
 CxImage image;
 if( !image.Load("image.bmp", CXIMAGE_FORMAT_BMP)) return ;
 if (image.IsValid())
 {
  image.Save("image.tif",CXIMAGE_FORMAT_TIF);
  
  if (!image.IsGrayScale()) image.IncreaseBpp( 24 );//颜色数
  image.SetJpegQuality( 80);// 图像的质量
  image.Save("image.jpg",CXIMAGE_FORMAT_JPG );
 }
 
}

3.2 在对话框上加一按钮,点击抓屏BMP位图,通过剪切板保存为JPG文件。

void CTestImgDlg::OnButton2()
{
 CDC *pDC = GetDC();  
 CDC memDC;  
 memDC.CreateCompatibleDC(pDC);  //pDC兼容DC
 
 CRect rect;
 GetClientRect(&rect);  //客户区大小
 
 CBitmap m_bmpCatch;
 m_bmpCatch.CreateCompatibleBitmap(pDC, rect.Width(),  rect.Height());  //pDC兼容bmp
 memDC.SelectObject(&m_bmpCatch);  //选bmp
 memDC.BitBlt(0, 0, rect.Width(), rect.Height(), pDC, rect.left, rect.top, SRCCOPY); //pDC --> m_bmpCatch 
 
 /

long size = 0;  
    BYTE *buf = NULL;  
    image.Encode(buf, size, CXIMAGE_FORMAT_JPG);  
    image.SetJpegQuality(100); 
 image.Save("scr.jpg", CXIMAGE_FORMAT_JPG);    
 
    free(buf);    
 ReleaseDC(pDC);  
 memDC.DeleteDC();  
}

② 在TestImgDlg.cpp文件顶部,加入以下代码:

#include "img_h/ximage.h"

//#pragma comment(lib,"lib/cximagecrtd.lib") //静态链接库时使用,还要对应的cximagecrtd.dll
#pragma comment(lib,"img_lib/cximage.lib")
#pragma comment(lib,"img_lib/Jpeg.lib")
#pragma comment(lib,"img_lib/png.lib ")
#pragma comment(lib,"img_lib/zlib.lib ")
#pragma comment(lib,"img_lib/tiff.lib ")
#pragma comment(lib,"img_lib/jasper.lib ")
//#pragma comment(lib,"img_lib/jbig.lib ")
#pragma comment(lib,"img_lib/libdcr.lib ")
#pragma comment(lib,"img_lib/mng.lib ")

③ 根据上步的可知,要在工程下新建img_h和img_lib文件夹。根据编译的需要逐次将CxImage下的ximage.h xfile.h ximadef.h xiofile.h xmenfile.h ximacfg.h,复制到img_h下,全部复制也可。将上面链接需要的库文件拷贝到img_lib文件夹下。

④运行下,看看是否完成了。!

后记
在VC++ 6.0中完成如上,且可在VS2005中直接使用。如要在VS2005中编译,可能需要在工程属性中将字符集设置为Not Set !

----------------------

一。原英文网页
http://www.codeproject.com/Articles/1300/CxImage

二。编译CxImage类库相关说明

1。作者提供的工程文件CxImgLib.dsw (VC++6.0)非常大。如果你只需要能处理其中的几种格式,编译该类库时,你可以在配置的头文件ximcfg.h 中找到一些编译开关选项来关闭一些图像库。JPG、PNG、TIFF中的每一个库,都会向最终程序增加约100KB的内容。而CxImage类库压缩后只有约60KB。所以,你需要谨慎挑选一些你真正需要的类库。

//类库配置文件:ximacfg.h
#define CXIMAGE_SUPPORT_JPG 1
//如果要实现bmp->jpg 则必须打开
#define CXIMAGE_SUPPORT_BMP 1
#define CXIMAGE_SUPPORT_GIF 1
#define CXIMAGE_SUPPORT_JPG 1
//以上为必须打开,下面的随便............
#define CXIMAGE_SUPPORT_PNG 0//不使用它
#define CXIMAGE_SUPPORT_MNG 0
#define CXIMAGE_SUPPORT_ICO 1
#define CXIMAGE_SUPPORT_TIF 0//
#define CXIMAGE_SUPPORT_TGA 0//
#define CXIMAGE_SUPPORT_PCX 0//
#define CXIMAGE_SUPPORT_WBMP 0//
#define CXIMAGE_SUPPORT_WMF 0//
#define CXIMAGE_SUPPORT_J2K 0 // Beta, use JP2
#define CXIMAGE_SUPPORT_JBG 0
//.............

其他的可以不打开

编译该类库有好几个选择的工程,如下图所示:

各工程的作用对应如下:

CxImage : cximage.lib - static library
CxImageCrtDll : cximagecrt.dll - DLL not using mfc
CxImageMfcDll : cximage.dll - DLL using mfc
Demo : demo.exe - program linked with cximage.lib and the C libraries
DemoDll : demodll.exe - program linked with cximagecrt.dll
j2k,jasper,jbig,jpeg,png,tiff,zlib : static C libraries
编译这些工程需要耗费几分钟的时间(中间文件可达60MB)。

三。在程序中应用CxImage类库进行图像类型转换

在你的VC工程中使用这个类库,要对工程进行如下设置(Project Settings):

|- C/C++
|   |- Code Generation
|   |   |- Use run-time library : Multithreaded DLL (must be the same for
|   |   | all the linked libraries) //应该只要是多线程DLL即可,DEBUG的也行
|   |   |- Struct member alignment : must be the same for all the linked libraries
|   |- Precompiled headers : not using precompiled headers
|   |- Preprocessor
|       |- Additional Include Directories: ..\cximage(该处填CxImage里的.h和.cpp文件拷贝并导入工程后所在的文件夹,填写后在工程中include时编译器会查找该文件夹,故include的文件无需路径)
|- Link
    |- General
        |- Object/library modules: png.lib
                                                       jpeg.lib
                                                       zlib.lib
                                                       tiff.lib
                                                       jasper.lib
                                                      cximage.lib (把需要的lib文件从CxImage中拷贝到工程中的lib文件所在的目录)

并且从CxImage中将xfile.h、ximacfg.h、ximadef.h、ximage.cpp、ximage.h、xiofile.h、 xmemfile.cpp、xmemfile.h拷贝到工程文件夹下并将CxImage.h文件加入工程中即可。也可以设置vc6的"tools"中的 "include"路径.

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

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;

关于CxImage类库作者: Davide Pizzolato,一位电子工程师。1984年开始编程,已不在乎使用何种编程语言来开发软件。现就职于Askoll的电子研发部。
官网:http://www.codeproject.com/bitmap/cximage.asp
作者:http://www.xdp.it/

CxImage功能强大的图形处理程序相关推荐

  1. citra 图形设置_功能强大的图形绘制软件

    Canvas Draw mac是一款功能强大的图形绘制软件,轻松帮助您与同事轻松共享项目.Canvas Draw内置大量模板和素材,包括一套全面的矢量对象和高级光栅图像编辑工具,可让你将单一文档中的适 ...

  2. d3.js 旋转图形_一个简单易用但功能强大的图形矢量化软件,扫描图片转换成CAD图的软件等等...

    背景简介 很多童鞋可能可能有想要把图片转成CAD能打开的格式,但是找不到软件,今天要分享的这个软件值得一试. 内容简介 AlgoLabR2VToolkit是一个将光栅图像转换为矢量图像的软件,转换后的 ...

  3. Qt怎么实现将bmp图片转换成Ascii_一个简单易用但功能强大的图形矢量化软件,扫描图片转换成CAD图的软件等等...

    背景简介 很多童鞋可能可能有想要把图片转成CAD能打开的格式,但是找不到软件,今天要分享的这个软件值得一试. 内容简介 AlgoLabR2VToolkit是一个将光栅图像转换为矢量图像的软件,转换后的 ...

  4. 一款功能强大且专业好用的CAD图形创建工——corelcad 2021

    CAD或计算机辅助设计现已成为许多行业的重要组成部分,各种制造商和设计师都需要同时绘制2D和3D模型以帮助设计过程或创建蓝图,但这不是标准图像编辑软件可以完成的任务,所以小编特意带来最新产品:core ...

  5. 一款功能强大,可扩展端到端加密反向Shell的工具

    关于Mediator Mediator是一款功能强大的可扩展端到端加密反向Shell,该工具基于新型架构实现,采用Python语言开发,能够帮助广大研究人员通过一台"Mediator&quo ...

  6. java许愿墙_wishingWall 一个好看的许愿墙板块,功能强大,页面美观 Java Develop 238万源代码下载- www.pudn.com...

    文件名称: wishingWall下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 1839 KB 上传时间: 2013-04-25 下载次数: 6 提 供 者: ...

  7. 值得收藏的12款小众冷门但功能强大的在线神器

    推荐12款小众冷门但功能强大的在线神器! 一键生成视频动画.一键抠图50张.一键制作PPT.一键生成数据图表....免费且智能,每一个工具你都可能会用到! 一.在线视频制作神器 1.MG动画智能生成 ...

  8. 这是一款功能强大的开源 Python 绘图库

    今天给大家分享一篇可视化干货,介绍的是功能强大的开源 Python 绘图库 Plotly,教你如何用超简单的(甚至只要一行!)代码,绘制出更棒的图表. 我之前一直守着 matplotlib 用的原因, ...

  9. 耗时一周整体,这4款黑科技电脑软件,功能强大到离谱

    闲话少说,直上狠货. 1.有道云笔记 有道云这是一款国民级的文稿编辑器,俗话说得好,好记性不如烂笔头,强大实用的笔记软件,能让你的工作与学习事半功倍.5大文稿类型,让记录得心应手,随时进行创作编辑. ...

  10. 【EndNote】功能强大的文献管理软件

    EndNote X9是一款功能强大的文献管理软件,使用这款EndNote X9破解版可以让你直接将其安装到Windows操作系统上使用,如果您正需要这款免费版工具,马上下载EndNote X9使用吧. ...

最新文章

  1. python flask 方法get_json返回(Ellipsis, Ellipsis)问题解决
  2. java窗口how2j_How2J Java 基础
  3. php 怎么防止提交空记录,为什么空提交什么都不提示?
  4. rsync同步数据到内网
  5. Annotation实战【自定义AbstractProcessor】
  6. 浅析LAN交换机的线速释义 From: www.c114.net
  7. TIME_WAIT太多解决思路和方法
  8. Andorid AlertDialog 点击后自动消失_Andorid-APP 安全(五)之android取证-文件系统与数据结构...
  9. 帆软报表使用及设置日志打印sql
  10. NHibernate查询语言(HQL)
  11. Web Api 接口文档制作
  12. 火狐浏览器国内版和国际版区别
  13. IEEE1588 ( PTP ) 协议简介
  14. Windows10 VMware 虚拟机桥接模式无法上网 但是和宿主机能互相ping通
  15. 关系数据库(范式判断、函数依赖、无损分解、正则覆盖)
  16. kityminder百度脑图转xmind
  17. [LiteratureReview]A Collaborative Visual SLAM Framework for Service Robots
  18. java se运行环境_Java运行环境Java SE Runtime Environment (JRE) 下载
  19. 【读论文】Character-Level Language Modeling with Deeper Self-Attention(Vanilla Transformer)
  20. 【Unity】监听编辑器聚焦/激活状态OnEditorFocus

热门文章

  1. 中学数学建模书籍及相关的视频等(2022.08.09)
  2. js 导出 excel
  3. zendstudio html插件,ZendStudio安装Aptana插件(html,css,js代码提示功能)_html/css_WEB-ITnose...
  4. H5+App开发框架汇总
  5. python2.7中文手册下载_python 2.7.12中文文档下载|
  6. 计算机专业英语词汇分类收录
  7. 2021版手机号验证最新正则表达式
  8. uniapp的选择收货地址
  9. 很无聊但是又很重要的 计算机网络基础知识 ---“互联网协议“
  10. 计算机网络数据通信部分之网络层IP报文格式解析