?? cap.cpp
字號(hào):
/*
* 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
* 文件標(biāo)識(shí):LPR-01-001
* 摘要:牌照識(shí)別的圖像獲取接口Dll
*
* 當(dāng)前版本:1.0
* 作者:try2it.com
* 開(kāi)始日期: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; // 版本號(hào)
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)
{
// 彈出選擇文件對(duì)話框
if(GetOpenFileName(&ofn))
{
// 獲取文件擴(kuò)展名
_tcscpy(g_szFileNameExt, g_szFileName+ofn.nFileExtension);
// 如果后綴為BMP, 不區(qū)分大小寫
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, 不區(qū)分大小寫
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);
}
// 如果失敗,清除全局文件名和擴(kuò)展名
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; // 打開(kāi)文件句柄
long lFileSize; // 文件大小
int nBytesRead; // 讀取的文件大小
BYTE *FileBuffer = NULL; // 讀取文件的緩沖區(qū)
BYTE *buf = NULL; // 臨時(shí)空間
int res = 1;
__try
{
// 讀取圖像文件
if ((file = ::_tfopen(szFileName, "rb")) == NULL)
{
res = 0;
__leave;
}
// 獲取文件大小
fseek(file, 0, SEEK_END);
lFileSize = ftell(file);
// 返回圖像數(shù)據(jù)大小,不包括文件頭
if (NULL == Buffer)
{
*dwBufferSize = (DWORD)lFileSize - sizeof(BITMAPFILEHEADER);
res = 1;
__leave;
}
*dwBufferSize = (DWORD)lFileSize - sizeof(BITMAPFILEHEADER);
// 申請(qǐng)臨時(shí)空間
if ((buf = (BYTE*)malloc(*dwBufferSize))==NULL)
{
res = 0;
__leave;
}
// 到文件開(kāi)頭, 要跳過(guò)文件頭
fseek(file, sizeof(BITMAPFILEHEADER), SEEK_SET);
// 讀取位圖數(shù)據(jù)
nBytesRead = fread(buf, sizeof(BYTE), lFileSize - sizeof(BITMAPFILEHEADER), file);
} // __try
__finally
{
// 拷貝數(shù)據(jù)到調(diào)用方
if (NULL != Buffer)
memcpy(Buffer, buf, *dwBufferSize);
// 釋放臨時(shí)空間
if (buf)
free(buf);
// 關(guān)閉文件句柄
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庫(kù)
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;
}
// 設(shè)置本地?cái)?shù)據(jù)
width = jcprops.JPGWidth;
height = jcprops.JPGHeight;
// 解壓縮為24位位圖
nchannels = 3;
// 計(jì)算 DIB padding
dib_line_width = width * nchannels;
dib_pad_bytes = IJL_DIB_PAD_BYTES(width,nchannels);
// 計(jì)算希望的象素緩沖區(qū)大小
wholeimagesize = ( dib_line_width + dib_pad_bytes ) * height;
// 返回圖像數(shù)據(jù)尺寸
if (NULL == Buffer)
{
*dwBufferSize = sizeof(BITMAPINFOHEADER) + wholeimagesize;
res = 1;
__leave;
}
// 申請(qǐng)臨時(shí)空間
*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;
// 設(shè)置希望的DIB數(shù)據(jù)信息
jcprops.DIBWidth = width;
jcprops.DIBHeight = -height; // DIB數(shù)據(jù)倒序
jcprops.DIBChannels = nchannels;
jcprops.DIBColor = IJL_BGR;
jcprops.DIBPadBytes = dib_pad_bytes;
jcprops.DIBBytes = reinterpret_cast<BYTE*>(buf +
sizeof(BITMAPINFOHEADER));
// 設(shè)置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
{
// 拷貝數(shù)據(jù),傳送到調(diào)用方
if (NULL != Buffer)
memcpy(Buffer, buf, *dwBufferSize);
// 釋放臨時(shí)空間
if (buf)
free(buf);
// 釋放IJL庫(kù)
ijlFree(&jcprops);
} // __finally
return res;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -