CxImage类库是一个优秀的图像操作类库。它可以快捷地存取、显示、转换各种图像。有的读者可能说,有那么多优秀的图形库,如OpenIL,FreeImage,PaintLib等等,它们可谓是功能强大,齐全,没必要用其它的类库。但我要说,这些类库基本上没有免费的,使用这些类库,你要被这样那样的许可协议所束缚。在这点上,CxImage类库是完全免费的。另外,在使用上述类库时,你会遇到重重麻烦。因为它们大部分是平台无关的,且用C语言写成,有的还夹杂着基本的C++ wrapper和成堆的编译选项的声明需要你去处理。而CxImage类库在这方面做得很好。还有让我最看好的,就是作者完全公开了源代码。相对于那些封装好的图形库和GDI+来说,这一点使我们可以进一步学习各种编解码技术,而不再浮于各种技术的表面。
为什么使用CxImage
1、 它是平台无关的
2、 它是自由软件、免费的、开源的
3、 支持多种平面格式:BMP、GIF、ICO、TGA、JPEG、PCX、PNG、TIFF、MNG、RAS等,还有更多!
4、 功能强大:几何变换、图像处理、图像格式转换等。
5、 使用简单:下面的入门教程会给你展示这一点。
CxImage的功能
Constructors 构造函数
Initialization 初始化
File 文件操作,主要是编解码
Generic 图像基本变化
DSP 图像处理操作
Painting 绘图操作
Multiple Images 多帧图像操作
Transparency 透明层操作
Palette 调色板操作
Pixels 像素操作
Region Selection 区域选择操作
Alpha Channel Alpha通道操作
Layers 图像层操作
Attributes 图像属性操作
Miscellaneous 杂项
呵呵,够强大吧!一个类库再好,不能为我们所用,则一切都是空谈,怎么用,请看详细步骤:
废话不多说了,从http://www.xdp.it/cximage/下载cximage701_full.7z;
当然你也可以在http://sourceforge.net/projects/cximage/下载到cximage702_full.7z;
不过我本人使用的版本是701
1、初始工作
下载得到的工程,解压,用vs2012来编译(打开的sln文件,在解决方案中右键重新生成)
得到了debug版本的所以用的lib库文件(lz泪奔啊。。所有生成的lib都在自己的文件夹下的debug文件夹中。。)
lz为了免去大家的麻烦,在csdn上面提供用vs2012编译的lib(包含头文件和debug文件,不提供release文件,因为现阶段只是为了熟悉库的使用----也不提供unicode的)
对应的下载地址为:http://download.csdn.net/detail/zengraoli/5108690
2、把得到的lib和头文件一个个拷出来
放在文件夹CxImage下
3、来个测试工程(仅仅为了显示一副png图片)
测试代码:
对stdafx.h相应的加入如下:
// stdafx.h : 标准系统包含文件的包含文件, // 或是经常使用但不常更改的 // 特定于项目的包含文件 // #pragma once #define _CRT_SECURE_NO_WARNINGS #define _CRT_SECURE_NO_DEPRECATE #include "targetver.h" #define WIN32_LEAN_AND_MEAN // 从 Windows 头文件中排除极少使用的信息 // Windows 头文件: #include <windows.h> // C 运行时头文件 #include <stdlib.h> #include <malloc.h> #include <memory.h> #include <tchar.h> // TODO: 在此处引用程序需要的其他头文件 #include "CxImage\\ximage.h" #pragma comment(lib, "CxImage\\cximage.lib") #pragma comment(lib, "CxImage\\jasper.lib") #pragma comment(lib, "CxImage\\jbig.lib ") #pragma comment(lib, "CxImage\\Jpeg.lib ") #pragma comment(lib, "CxImage\\libdcr.lib ") #pragma comment(lib, "CxImage\\libpsd.lib ") #pragma comment(lib, "CxImage\\mng.lib ") #pragma comment(lib, "CxImage\\png.lib ") #pragma comment(lib, "CxImage\\Tiff.lib ") #pragma comment(lib, "CxImage\\zlib.lib ")
testWinMain.cpp:
// testWinMain.cpp : 定义应用程序的入口点。 // #include "stdafx.h" #include "testWinMain.h" #define MAX_LOADSTRING 100 // 全局变量: HINSTANCE hInst; // 当前实例 TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本 TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名 // 此代码模块中包含的函数的前向声明: ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPTSTR lpCmdLine, _In_ int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: 在此放置代码。 MSG msg; HACCEL hAccelTable; // 初始化全局字符串 LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_TESTWINMAIN, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); // 执行应用程序初始化: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TESTWINMAIN)); // 主消息循环: while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam; } // // 函数: MyRegisterClass() // // 目的: 注册窗口类。 // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TESTWINMAIN)); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = MAKEINTRESOURCE(IDC_TESTWINMAIN); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassEx(&wcex); } // // 函数: InitInstance(HINSTANCE, int) // // 目的: 保存实例句柄并创建主窗口 // // 注释: // // 在此函数中,我们在全局变量中保存实例句柄并 // 创建和显示主程序窗口。 // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; hInst = hInstance; // 将实例句柄存储在全局变量中 hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } // // 函数: WndProc(HWND, UINT, WPARAM, LPARAM) // // 目的: 处理主窗口的消息。 // // WM_COMMAND - 处理应用程序菜单 // WM_PAINT - 绘制主窗口 // WM_DESTROY - 发送退出消息并返回 // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; // HDC memdc; // HBITMAP hmap; /* CxImage* m_pCxImage; m_pCxImage = new CxImage; m_pCxImage->Load("test.png"); */ CxImage cximage; cximage.Load("test.png"); switch (message) { case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // 分析菜单选择: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: 在此添加任意绘图代码... /* hdc= GetDC(hWnd);*/ m_pCxImage->Draw(hdc, 0, 0); // hmap = (HBITMAP)LoadImage(NULL,L"test.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); // int nRet = GetLastError(); // memdc = CreateCompatibleDC(hdc); // SelectObject(memdc,hmap); // BitBlt(hdc,0,0,600,500,memdc,0,0,SRCCOPY); ReleaseDC(NULL,hdc); // DeleteObject(hmap); EndPaint(hWnd, &ps); break; case WM_DESTROY: /* if(m_pCxImage) { deleate m_pCxImage; } */ PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // “关于”框的消息处理程序。 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; }
对应的下载地址为:http://download.csdn.net/detail/zengraoli/5108716lz
想说的:测试项目之间就是在vs自动生成的项目里面加入的。。
没注重很优雅的细节。。很是抱歉啦!
4.显示的效果如下: