久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
分塊內存映射處理大文件-例子
[打印本頁]
作者:
bibi
時間:
2015-4-18 20:40
標題:
分塊內存映射處理大文件-例子
//////////////////////////////////////////////////////////////////////////
// 該函數用于讀取從CCD攝像頭采集來的RAW視頻數據當中的某一幀圖像,
// RAW視頻前596字節為頭部信息,可以從其中讀出視頻總的幀數,
// 幀格式為1024*576*8
/*
參數:
pszPath:文件名
dwFrame: 要讀取第幾幀,默認讀取第2幀
*/
BOOL MyFreeImage::LoadXRFrames(TCHAR *pszPath, DWORD dwFrame/* = 2*/ )
{
// get the frames of X-Ray frames
BOOL bLoop = TRUE;
inti;
int width = 1024;
int height = 576;
int bitcount = 8;//1, 4, 8, 24, 32
//////////////////////////////////////////////////////////////////////////
//Build bitmap header
BITMAPFILEHEADER bitmapFileHeader;
BITMAPINFOHEADER bitmapInfoHeader;
BYTE rgbquad[4];// RGBQUAD
int index = 0;
DWORD widthbytes = ((bitcount*width + 31)/32)*4;//每行都是4的倍數 DWORD的倍數 這里是 576-
TRACE1("widthbytes=%d\n", widthbytes);
switch(bitcount) {
case 1:
index = 2;
bitmapFileHeader.bfOffBits = (DWORD)(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 2*4);
break;
case 4:
index = 16;
bitmapFileHeader.bfOffBits = (DWORD)(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 16*4);
break;
case 8:
index = 256;
bitmapFileHeader.bfOffBits = (DWORD)(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 256*sizeof(RGBQUAD));
break;
case 24:
case 32:
index = 0;
bitmapFileHeader.bfOffBits = (DWORD)(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER));
break;
default:
break;
}
//構造Bitmap文件頭BITMAPFILEHEADER
bitmapFileHeader.bfType = 0x4d42; // 很重要的標志位 BM 標識
bitmapFileHeader.bfSize = (DWORD)(bitmapFileHeader.bfOffBits + height * widthbytes);//bmp文件長度
bitmapFileHeader.bfReserved1 = 0;
bitmapFileHeader.bfReserved2 = 0;
//構造Bitmap文件信息頭BITMAPINFOHEADER
bitmapInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
bitmapInfoHeader.biWidth = width;
bitmapInfoHeader.biHeight = height;
bitmapInfoHeader.biPlanes = 1;
bitmapInfoHeader.biBitCount = bitcount;
bitmapInfoHeader.biCompression = BI_RGB; // 未壓縮
bitmapInfoHeader.biSizeImage = height * widthbytes;
bitmapInfoHeader.biXPelsPerMeter = 3780;
bitmapInfoHeader.biYPelsPerMeter = 3780;
bitmapInfoHeader.biClrUsed = 0;
bitmapInfoHeader.biClrImportant = 0;
//創建BMP內存映像,寫入位圖頭部
BYTE *pMyBmp = new BYTE[bitmapFileHeader.bfSize];// 我的位圖pMyBmp
BYTE *curr = pMyBmp;// curr指針指示pMyBmp的位置
memset(curr, 0, bitmapFileHeader.bfSize);
//寫入頭信息
memcpy(curr, &bitmapFileHeader,sizeof(BITMAPFILEHEADER));
curr = pMyBmp + sizeof(BITMAPFILEHEADER);
memcpy(curr, &bitmapInfoHeader,sizeof(BITMAPINFOHEADER));
curr += sizeof(BITMAPINFOHEADER);
//構造調色板 , 當像素大于8位時,就沒有調色板了。
if(bitcount == 8)
{
rgbquad[3] = 0;//rgbReserved
for(i = 0; i < index; i++)
{
rgbquad[0] = rgbquad[1] = rgbquad[2] = i;
memcpy(curr, rgbquad, sizeof(RGBQUAD));
curr += sizeof(RGBQUAD);
}
}else if(bitcount == 1)
{
rgbquad[3] = 0;//rgbReserved
for(i = 0; i < index; i++)
{
rgbquad[0] = rgbquad[1] = rgbquad[2] = (256 - i)%256;
memcpy(curr, rgbquad, sizeof(RGBQUAD));
curr += sizeof(RGBQUAD);
}
}
//////////////////////////////////////////////////////////////////////////
// 文件映射,從文件中查找圖像的數據
//Open the real file on the file system
HANDLE hFile = CreateFile(pszPath, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
DWORD dwError = GetLastError();
ATLTRACE(_T("MapFile, Failed in call to CreateFile, Error:%d\n"), dwError);
SetLastError(dwError);
bLoop = FALSE;
return FALSE;
}
//Create the file mapping object
HANDLE hMapping = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
if (hMapping == NULL)
{
DWORD dwError = GetLastError();
ATLTRACE(_T("MapFile, Failed in call to CreateFileMapping, Error:%d\n"), dwError);
// Close handle
if (hFile != INVALID_HANDLE_VALUE)
{
CloseHandle(hFile);
hFile = INVALID_HANDLE_VALUE;
}
SetLastError(dwError);
bLoop = FALSE;
return FALSE;
}
// Retrieve allocation granularity
SYSTEM_INFO sinf;
GetSystemInfo(&sinf);
DWORD dwAllocationGranularity = sinf.dwAllocationGranularity;
// Retrieve file size
// Retrieve file size
DWORD dwFileSizeHigh;
__int64 qwFileSize = GetFileSize(hFile, &dwFileSizeHigh);
qwFileSize |= (((__int64)dwFileSizeHigh) << 32);
CloseHandle(hFile);
// Read Image
__int64 qwFileOffset = 0;// 偏移地址
DWORD dwBytesInBlock = 0,// 映射的塊大小
dwStandardBlock = 100* dwAllocationGranularity ;// 標準塊大小
DWORD dwFrameSize = height*width; // 計算一幀圖像的數據量,不包括頭部信息
DWORD dwCurrentFrame = 1;
dwBytesInBlock = dwStandardBlock;
if (qwFileSize < dwStandardBlock)
dwBytesInBlock = (DWORD)qwFileSize;
//Map the view
LPVOID lpData = MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS,
static_cast<DWORD>((qwFileOffset & 0xFFFFFFFF00000000) >> 32), static_cast<DWORD>(qwFileOffset & 0xFFFFFFFF), dwBytesInBlock);
if (lpData == NULL)
{
DWORD dwError = GetLastError();
ATLTRACE(_T("MapFile, Failed in call to MapViewOfFile, Error:%d\n"), dwError);
// Close Handle
if (hMapping != NULL)
{
CloseHandle(hMapping);
hMapping = NULL;
}
SetLastError(dwError);
bLoop = FALSE;
return FALSE;
}
BYTE *lpBits = (BYTE *)lpData;
BYTE *curr1, *curr2, *lpEnd;
curr1 = lpBits;// seek to start
curr2 = lpBits + 596;// seek to first frame
lpEnd = lpBits + dwBytesInBlock;// seek to end
// Read video infomation
KMemDataStream streamData( curr1, dwBytesInBlock);
ReadXRHeader(streamData);
while(bLoop)
{
DWORD dwTmp = lpEnd - curr2;//內存緩沖剩余的字節
if ( dwTmp >= dwFrameSize )
{
if(dwCurrentFrame == dwFrame)
{
memcpy(curr, curr2, dwFrameSize);
bLoop = FALSE;
}
curr2 += dwFrameSize;
}else//內存中不夠一幀數據
{
DWORD dwTmp2 = dwFrameSize - dwTmp;// 一副完整的幀還需要dwTmp2字節
if (dwCurrentFrame == dwFrame)
{
memcpy(curr, curr2, dwTmp);
curr += dwTmp;
}
// 檢查還可以映射多少字節的東東到內存里面
if ( qwFileSize - qwFileOffset < dwStandardBlock)
dwBytesInBlock = (DWORD)(qwFileSize - qwFileOffset);
qwFileOffset += dwBytesInBlock;
UnmapViewOfFile(lpData);
lpData = MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS,
static_cast<DWORD>((qwFileOffset & 0xFFFFFFFF00000000) >> 32), static_cast<DWORD>(qwFileOffset & 0xFFFFFFFF), dwBytesInBlock);
if (lpData == NULL)// 一定要檢查,不然可能內存映射失敗
{
DWORD dwError = GetLastError();
ATLTRACE(_T("MapFile, Failed in call to MapViewOfFile, Error:%d\n"), dwError);
SetLastError(dwError);
bLoop = FALSE;
break;
}
curr2 = lpBits = (BYTE *)lpData;
lpEnd = lpBits + dwBytesInBlock;// seek to end
if (dwCurrentFrame == dwFrame)
{
memcpy(curr, curr2, dwTmp2);
bLoop = FALSE;
}
curr2 += dwTmp2;
}
dwCurrentFrame++;
if (dwCurrentFrame > ((LPKINFO)m_VideoInfoHeader)->frames ) // 到達文件末尾
{
bLoop = FALSE;
}
}
//將內存流 pMyBmp 轉為bitmap
KMemDataStream stream(pMyBmp, bitmapFileHeader.bfSize, true);
if(!LoadFromMemory(FIF_BMP, stream))
return FALSE;
//
if (lpData != NULL)
{
//FlushViewOfFile(lpData, 0);
UnmapViewOfFile(lpData);
lpData = NULL;
}
//remove the file mapping
if (hMapping != NULL)
{
CloseHandle(hMapping);
hMapping = NULL;
}
return TRUE;
}
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
亚洲日韩中文字幕一区
|
国产偷自视频区视频
|
最新中文字幕
|
www.夜夜骑
|
欧美一级二级在线观看
|
综合久久一区
|
国产免费自拍
|
jlzzjlzz国产精品久久
|
男人的天堂一级片
|
久久精品欧美一区二区三区不卡
|
欧美精品第一页
|
超碰成人免费观看
|
成人一区二区三区在线观看
|
男女激情网站免费
|
欧美1—12sexvideos
|
国产美女高潮
|
欧美一级免费片
|
免费三级黄
|
看片国产
|
亚洲在线免费
|
日韩毛片播放
|
国产美女在线观看
|
中国一级毛片免费
|
亚洲一区二区三
|
欧洲色
|
国产精品色哟哟网站
|
久久久久www
|
99国产精品99久久久久久
|
久久一区二区视频
|
亚洲成人中文字幕
|
久久国产精品一区二区三区
|
黄色在线观看
|
91视频在线
|
欧美操操操
|
天天干天天爱天天爽
|
av免费在线观看网站
|
色网在线看
|
91视频一区
|
99久久电影
|
韩三级在线观看
|
日日噜噜噜夜夜爽爽狠狠视频,
|