久久久久久久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久久电影| 韩三级在线观看 | 日日噜噜噜夜夜爽爽狠狠视频, |