写了一个非常方便的图像读取模块,支持bmp、jpg、gif、png、tiff等,内符详细使用说明和源代码。(仅win2000以上操作系统适用)
使用说明:
1. 在你的硬盘上建立下面三个文件:
ZImage.h——头声明
ZImage.cpp——源文件
WinMain.cpp——范例测试程序
2.把下面的代码按照所给文件名复制到相同的文件中。
3.如果您是VC6.0用户:新建一个win32工程,然后勾上空项目并等待创建成功。
然后在工程管理器里,把上面所述三个文件分别添加到相应文件夹里。编译后即可运行。
如果您是VS.net用户:新建一个win32工程,然后勾上空项目并等待创建成功。
然后在解决方案管理器里,把上面所述三个文件分别添加到相应文件夹里。编译后即可运行。
测试程序使用方法:
在窗口里单击鼠标左键,然后选择一个图像文件,并打开,您就可以在窗口里看到这幅图像了。
附:
1. 如果您仍然无法顺利通过编译,请回复或留言,我将尽快给予答复。
2. 本程序仅供测试使用,使用本程序完全是您的自愿,如果对您的计算机产生任何影响,本人概不负责。
3. 此代码您只能保留一份复本,未经本人允许,您不得通过复制、上传、转贴等手段在互联网上传播此代码,但您可以任意复制本贴子的地址。
//=======================================================================
// ZImage.h
#ifndef ZImage_H
#define ZImage_H
#include <windows.h>
#include <Gdiplus.h>
using namespace Gdiplus;
// 安全的删除指针
#define SAFEDELETE(p) if ( p ) { try{ delete []p; } catch(...){} p = NULL; }
// 封装读取函数,以一次性方便调用。
// r - 返回的指针;s - 要打开的文件名;p - BITMAPINFO结构体指针
#define LOADDZIMAGE( r, s, p ) ManagerZImage( );r = LoadZImage( s, p );ManagerZImage( );
// 断言
#define ASSERT(f) if( (f) ) throw "执行("#f##")时出错!"
// 管理对象起动
void ManagerZImage( void );
// 读取位图文件
LPVOID LoadZImage( char *pFileName, LPBITMAPINFO pbi );
// 释放内存
void FreeZImage( LPVOID pBuf );
// 获取最后一个错误信息字符串
LPCTSTR GetZImageLastError();
#endif
//=======================================================================
// ZImage.cpp
#include "ZImage.h"
#pragma comment( lib, "GdiPlus.lib" )
ULONG_PTR g_GdiPlusToken;
LPTSTR g_szLastErrorMessage;
void ManagerZImage( void )
{
if ( g_GdiPlusToken )
{
GdiplusShutdown( g_GdiPlusToken );
g_GdiPlusToken = NULL;
}
else
{
GdiplusStartupInput GdiPlus;
GdiplusStartup( &g_GdiPlusToken, &GdiPlus, NULL );
}
}
LPVOID ReleaseGdiResource( HDC hdc, HBITMAP hBitmap )
{
if ( hdc )
{
DeleteDC( hdc );
}
if ( hBitmap )
{
DeleteObject( hBitmap );
}
return NULL;
}
LPVOID LoadZImage( char *pFileName, LPBITMAPINFO pbi )
{
HDC hComDC = NULL;
HDC hdc;
HBITMAP hBitmap = NULL;
UINT nWidth, nHeight;
WCHAR szFileName[MAX_PATH];
LPVOID pBuf = NULL;
try
{
ASSERT( NULL == ( hdc = GetDC( NULL )) );
hComDC = CreateCompatibleDC( hdc );
ASSERT( NULL == hdc );
ZeroMemory( szFileName, sizeof(szFileName) );
ASSERT( 0 == MultiByteToWideChar( CP_ACP, MB_USEGLYPHCHARS | MB_ERR_INVALID_CHARS, pFileName, (int)strlen( pFileName ), szFileName, sizeof(szFileName) ) );
Image Img( szFileName );
ASSERT( Ok != Img.GetLastStatus() );
nWidth = Img.GetWidth();
nHeight = Img.GetHeight();
ASSERT( 0 == nWidth * nHeight );
ASSERT( NULL== (hBitmap = CreateCompatibleBitmap( hdc, nWidth, nHeight ) ) );
ASSERT( HGDI_ERROR == SelectObject( hComDC, hBitmap ) );
Graphics g( hComDC );
ASSERT( Ok != g.GetLastStatus() );
ASSERT( Ok != g.DrawImage( &Img, 0, 0, nWidth, nHeight ) );
ZeroMemory( pbi, sizeof(BITMAPINFO) );
pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
ASSERT( 0 == GetDIBits( hComDC, hBitmap, 0, 0, NULL, pbi, DIB_RGB_COLORS ) );
DWORD dwBufSize = pbi->bmiHeader.biWidth * pbi->bmiHeader.biHeight * pbi->bmiHeader.biBitCount / 8;
ASSERT( dwBufSize == 0 );
ASSERT( NULL == (pBuf = GlobalAlloc( GMEM_FIXED, dwBufSize ) ) );
ASSERT( 0 == GetDIBits( hComDC, hBitmap, 0, pbi->bmiHeader.biHeight, pBuf, pbi, DIB_RGB_COLORS ) );
}
catch ( char *p )
{
if ( pBuf )
{
GlobalFree( pBuf );
pBuf = NULL;
}
g_szLastErrorMessage = p;
}
ReleaseGdiResource( hdc, hBitmap );
return pBuf;
}
void FreeZImage( LPVOID pBuf )
{
GlobalFree( pBuf );
}
LPCTSTR GetZImageLastError()
{
return NULL == g_szLastErrorMessage ? "" : g_szLastErrorMessage;
}