📄 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<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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -