www.gusucode.com > 基于C++的TRY2LPR-1.0开源车牌识别核心-源码程序 > 基于C++的TRY2LPR-1.0开源车牌识别核心-源码程序\code\Cap\Cap.cpp

    /*
* Copyright (c) 2003, try2it.com
* All rights reserved.
* Download by http://www.NewXing.com
* 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<LPSTR>(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<BITMAPINFOHEADER*>(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<BYTE*>(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;
}