Cximage701在vs2012中的使用---显示一副图片

CxImage类库是一个优秀的图像操作类库。它可以快捷地存取、显示、转换各种图像。有的读者可能说,有那么多优秀的图形库,如OpenILFreeImagePaintLib等等,它们可谓是功能强大,齐全,没必要用其它的类库。但我要说,这些类库基本上没有免费的,使用这些类库,你要被这样那样的许可协议所束缚。在这点上,CxImage类库是完全免费的。另外,在使用上述类库时,你会遇到重重麻烦。因为它们大部分是平台无关的,且用C语言写成,有的还夹杂着基本的C++ wrapper和成堆的编译选项的声明需要你去处理。而CxImage类库在这方面做得很好。还有让我最看好的,就是作者完全公开了源代码。相对于那些封装好的图形库和GDI+来说,这一点使我们可以进一步学习各种编解码技术,而不再浮于各种技术的表面。


为什么使用CxImage

1 它是平台无关的

2 它是自由软件、免费的、开源的

3 支持多种平面格式:BMPGIFICOTGAJPEGPCXPNGTIFFMNGRAS等,还有更多!

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.显示的效果如下:

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值