www.pudn.com > try2LPR-1.0.rar > Cap.cpp


/* 
* Copyright (c) 2003, try2it.com 
* All rights reserved. 
* 
* This program is free software; you can redistribute it and/or modify it under 
* the terms of the GNU General Public License as published by the Free Software 
* Foundation; either version 2 of the License, or (at your option) any later 
* version. 
*  
* This program is distributed in the hope that it will be useful, but WITHOUT 
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 
* details. 
*  
* You should have received a copy of the GNU General Public License along with 
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple 
* Place - Suite 330, Boston, MA 02111-1307, USA. 
* 
* 文件名称:Cap.cpp 
* 文件标识:LPR-01-001 
* 摘要:牌照识别的图像获取接口Dll 
* 
* 当前版本:1.0 
* 作者:try2it.com 
* 开始日期:2003年09月15日 
* 完成日期:2003年09月20日 
*/ 
 
#include "stdafx.h" 
#include "Cap.h" 
#include "..\include\ijl.h" 
// 包含ijl.lib(JPEG图像解码) 
#pragma comment(lib, "..\\lib\\ijl15") 
 
// 定义全局变量 
HWND g_hWnd = NULL;        // 主程序窗口句柄 
TCHAR g_szFileName[MAX_PATH] = "";   // 文件名 
TCHAR g_szFileNameExt[MAX_PATH] = ""; 
const VERSION = 0x0101;    // 版本号 
 
BOOL APIENTRY DllMain( HANDLE hModule,  
                       DWORD  ul_reason_for_call,  
                       LPVOID lpReserved 
					 ) 
{ 
	switch (ul_reason_for_call) 
	{ 
		case DLL_PROCESS_ATTACH: 
			break; 
		case DLL_THREAD_ATTACH: 
			break; 
		case DLL_THREAD_DETACH: 
			break; 
        case DLL_PROCESS_DETACH: 
			break; 
    } 
    return TRUE; 
} 
 
 
CAP_API int CALLAGREEMENT InitCapDll(HWND hWnd, WORD *Version) 
{ 
	g_hWnd = hWnd; 
	*Version = VERSION; 
 
	return 1; 
} 
 
CAP_API int CALLAGREEMENT GetAVI() 
{ 
	return 0; 
} 
 
 
CAP_API int CALLAGREEMENT GetImg(BYTE *Buffer, DWORD * dwBufferSize) 
{ 
	int res = 0; 
 
	OPENFILENAME ofn;			           
 
    ZeroMemory(&ofn, sizeof(ofn));  
 
    ofn.lStructSize = sizeof(ofn); 
    ofn.hwndOwner = g_hWnd; 
    ofn.lpstrFilter = "JPG Files (*.jpg)\0*.jpg\0BMP Files (*.bmp)\0*.bmp\0All Files (*.*)\0*.*\0"; 
    ofn.lpstrFile = g_szFileName; 
    ofn.nMaxFile = MAX_PATH; 
    ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; 
    ofn.lpstrDefExt = "jpg"; 
 
	if (_tcsclen(g_szFileName) == 0) 
	{ 
		// 弹出选择文件对话框 
		if(GetOpenFileName(&ofn)) 
		{ 
			// 获取文件扩展名 
			_tcscpy(g_szFileNameExt, g_szFileName+ofn.nFileExtension); 
	 
			// 如果后缀为BMP, 不区分大小写 
			if(_tcsicmp(g_szFileNameExt, _T("BMP"))==0) 
			{ 
				res = LoadBMP(g_szFileName, Buffer, dwBufferSize); 
			} 
			else if (_tcsicmp(g_szFileNameExt, "JPG")==0) 
			{ 
				res = LoadJPG(g_szFileName, Buffer, dwBufferSize); 
			} 
		} 
	} 
	else 
	{ 
	 
		// 如果后缀为BMP, 不区分大小写 
		if(_tcsicmp(g_szFileNameExt, _T("BMP"))==0) 
		{ 
			res = LoadBMP(g_szFileName, Buffer, dwBufferSize); 
		} 
		else if (_tcsicmp(g_szFileNameExt, "JPG")==0) 
		{ 
			res = LoadJPG(g_szFileName, Buffer, dwBufferSize); 
		} 
		memset(g_szFileName, 0, MAX_PATH); 
		memset(g_szFileNameExt, 0, MAX_PATH); 
	} 
	// 如果失败,清除全局文件名和扩展名 
	if (0 == res) 
	{ 
		memset(g_szFileName, 0, MAX_PATH); 
		memset(g_szFileNameExt, 0, MAX_PATH); 
	} 
	return res; 
} 
 
 
CAP_API int CALLAGREEMENT SetCap() 
{ 
	// ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT; 
	return 0; 
} 
 
 
int LoadBMP(LPCTSTR szFileName, BYTE *Buffer, DWORD * dwBufferSize) 
{ 
	FILE *file;                         // 打开文件句柄 
 
	long lFileSize;                     // 文件大小 
    int  nBytesRead;                    // 读取的文件大小 
	BYTE *FileBuffer = NULL;            // 读取文件的缓冲区 
	BYTE *buf = NULL;                   // 临时空间 
	int res = 1; 
 
	__try 
	{ 
		// 读取图像文件 
		if ((file = ::_tfopen(szFileName, "rb")) == NULL) 
		{ 
			res = 0; 
			__leave; 
		} 
		// 获取文件大小 
		fseek(file, 0, SEEK_END); 
		lFileSize = ftell(file); 
 
		// 返回图像数据大小,不包括文件头 
		if (NULL == Buffer) 
		{ 
			*dwBufferSize = (DWORD)lFileSize - sizeof(BITMAPFILEHEADER); 
			res = 1; 
			__leave; 
		} 
 
		*dwBufferSize = (DWORD)lFileSize - sizeof(BITMAPFILEHEADER); 
		// 申请临时空间 
		if ((buf = (BYTE*)malloc(*dwBufferSize))==NULL) 
		{ 
			res = 0; 
			__leave; 
		} 
 
		// 到文件开头, 要跳过文件头 
		fseek(file, sizeof(BITMAPFILEHEADER), SEEK_SET); 
 
		// 读取位图数据 
		nBytesRead = fread(buf, sizeof(BYTE), lFileSize - sizeof(BITMAPFILEHEADER), file); 
	} // __try 
	__finally 
	{ 
		// 拷贝数据到调用方 
		if (NULL != Buffer) 
			memcpy(Buffer, buf, *dwBufferSize); 
		 
		// 释放临时空间 
		if (buf) 
			free(buf); 
 
		// 关闭文件句柄 
		if (file) 
			fclose(file); 
	} // __finally 
	return res; 
} 
 
 
int LoadJPG(LPCTSTR szFileName, BYTE *Buffer, DWORD * dwBufferSize) 
{ 
	int res; 
	IJLERR jerr; 
	int width; 
	int height; 
	DWORD nchannels; 
	DWORD dib_line_width; 
	DWORD dib_pad_bytes; 
	DWORD wholeimagesize; 
	BITMAPINFOHEADER *bmih = NULL; 
	// Allocate the IJL JPEG_CORE_PROPERTIES structure. 
	JPEG_CORE_PROPERTIES jcprops; 
 
	BYTE *buf = NULL; 
 
	// JPG文件 
	res = 1; 
	__try 
	{ 
		// 初始化IJL库 
		jerr = ijlInit(&jcprops); 
		// 初始化不成功 
		if(IJL_OK != jerr) 
		{ 
			res = 0; 
			__leave; 
		} 
 
		// 获取JPG图像的信息(高度,宽度,等) 
		jcprops.JPGFile = const_cast(szFileName); 
		jerr = ijlRead(&jcprops,IJL_JFILE_READPARAMS); 
		if(IJL_OK != jerr) 
		{ 
			res = 0; 
			__leave; 
		} 
				 
		// 设置本地数据 
		width = jcprops.JPGWidth; 
		height = jcprops.JPGHeight; 
		// 解压缩为24位位图 
		nchannels = 3;  
 
		// 计算 DIB padding 
		dib_line_width = width * nchannels; 
		dib_pad_bytes = IJL_DIB_PAD_BYTES(width,nchannels); 
		// 计算希望的象素缓冲区大小 
		wholeimagesize = ( dib_line_width + dib_pad_bytes ) * height; 
 
		// 返回图像数据尺寸 
		if (NULL == Buffer) 
		{ 
			*dwBufferSize = sizeof(BITMAPINFOHEADER) + wholeimagesize; 
			res = 1; 
			__leave; 
		} 
		 
		// 申请临时空间 
		*dwBufferSize = sizeof(BITMAPINFOHEADER) + wholeimagesize; 
		if ((buf = (BYTE*)malloc(*dwBufferSize)) == NULL) 
		{ 
			res =0; 
			__leave; 
		} 
 
		bmih = reinterpret_cast(buf); 
		bmih->biSize = sizeof(BITMAPINFOHEADER); 
		bmih->biWidth = width; 
		bmih->biHeight = height; 
		bmih->biPlanes = 1; 
		bmih->biBitCount = 24; 
		bmih->biCompression = BI_RGB; 
		bmih->biSizeImage = 0; 
		bmih->biXPelsPerMeter = 0; 
		bmih->biYPelsPerMeter = 0; 
		bmih->biClrUsed = 0; 
		bmih->biClrImportant = 0; 
				 
		// 设置希望的DIB数据信息 
		jcprops.DIBWidth = width; 
		jcprops.DIBHeight = -height; // DIB数据倒序 
		jcprops.DIBChannels = nchannels; 
		jcprops.DIBColor = IJL_BGR; 
		jcprops.DIBPadBytes = dib_pad_bytes; 
		jcprops.DIBBytes = reinterpret_cast(buf + 
		                      sizeof(BITMAPINFOHEADER)); 
        // 设置JPG颜色空间 
		switch(jcprops.JPGChannels) 
		{ 
			case 1: 
			{ 
				jcprops.JPGColor = IJL_G; 
				break; 
			} 
			case 3: 
			{ 
				jcprops.JPGColor = IJL_YCBCR; 
				break; 
			} 
			default: 
			{ 
				jcprops.DIBColor = (IJL_COLOR)IJL_OTHER; 
				jcprops.JPGColor = (IJL_COLOR)IJL_OTHER; 
				break; 
			} 
		} 
		// 解码 
		jerr = ijlRead(&jcprops,IJL_JFILE_READWHOLEIMAGE); 
		if(IJL_OK != jerr) 
		{ 
			res = 0; 
			__leave; 
		} 
	} // __try 
	__finally 
	{ 
		// 拷贝数据,传送到调用方 
		if (NULL != Buffer) 
			memcpy(Buffer, buf, *dwBufferSize); 
		// 释放临时空间 
		if (buf) 
			free(buf); 
		// 释放IJL库 
		ijlFree(&jcprops); 
	} // __finally 
	return res; 
}