64,663
社区成员
发帖
与我相关
我的任务
分享
static int i = 0;
int dataSize = 0;
char appExePath[256] = { 0 };
char appDir[256] = { 0 };
char saveBmpPath[256] = { 0 };
HINSTANCE hInst = AfxGetApp()->m_hInstance;
GetModuleFileName(hInst, appExePath, sizeof(appExePath));
_splitpath(appExePath, NULL, appDir, NULL, NULL);
Dahua::Infra::CTime currentTime = Dahua::Infra::CTime::getCurrentTime();
sprintf((char*)saveBmpPath, "%s\\Image\\Pic_%4d-%.2d-%.2d-%.2d-%.2d-%.2d_blockId#%d.bmp",
appDir, currentTime.year, currentTime.month, currentTime.day, currentTime.hour, currentTime.minute, currentTime.second, frameBuffer->bufPtr());
//sprintf(saveBmpPath, "%s\\Image\\Pic_blockId#%d.bmp", appDir, frameBuffer->BlockId());
HANDLE hFile = CreateFile(saveBmpPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
return;
}
unsigned int uRgbQuadLen = 0; //调色板,只有8bit以下才需要
BITMAPFILEHEADER bmpFileHeader;
BITMAPINFOHEADER bmpInfoHeader;
// 设置BMP文件头
bmpFileHeader.bfType = 0x4D42; // 文件头类型 'BM'(42 4D)
bmpFileHeader.bfSize = sizeof(bmpFileHeader) + sizeof(bmpInfoHeader) + frameBuffer->imageWidth() * frameBuffer->imageHeight() * 3; //文件大小
bmpFileHeader.bfReserved1 = 0; //保留字
bmpFileHeader.bfReserved2 = 0; //保留字
// 设置BMP信息头
bmpInfoHeader.biSize = 40; //信息头所占字节数
bmpInfoHeader.biWidth = frameBuffer->imageWidth(); //位图宽度
bmpInfoHeader.biHeight = frameBuffer->imageHeight(); //位图高度
bmpInfoHeader.biPlanes = 1; //位图平面数
/* 转码 */
if (frameBuffer->imagePixelFormat() == Dahua::GenICam::gvspPixelMono8)
{
dataSize = frameBuffer->bufSize();
bmpInfoHeader.biHeight = -frameBuffer->imageHeight();
bmpInfoHeader.biBitCount = 8;
uRgbQuadLen = sizeof(RGBQUAD) * 256;
bmpFileHeader.bfSize = sizeof(bmpFileHeader) + sizeof(bmpInfoHeader) + uRgbQuadLen + frameBuffer->imageWidth() * frameBuffer->imageHeight();
}
else
{
dataSize = frameBuffer->imageWidth() * frameBuffer->imageHeight() * 3;
bmpInfoHeader.biHeight = -frameBuffer->imageHeight(); //rgb数据保存为bmp,上下会颠倒,需要设置height为负值
bmpInfoHeader.biBitCount = 24; //像素位数
}
bmpFileHeader.bfOffBits = 54 + uRgbQuadLen; //位图像素数据的起始位置
bmpInfoHeader.biCompression = 0; //压缩类型,0 即不压缩
bmpInfoHeader.biSizeImage = 0;
bmpInfoHeader.biXPelsPerMeter = 0;
bmpInfoHeader.biYPelsPerMeter = 0;
bmpInfoHeader.biClrUsed = 0;
bmpInfoHeader.biClrImportant = 0;
DWORD dwWrite = 0;
WriteFile(hFile, &bmpFileHeader, sizeof(BITMAPFILEHEADER), &dwWrite, NULL);
WriteFile(hFile, &(bmpInfoHeader), sizeof(BITMAPINFOHEADER), &dwWrite, NULL);
if (frameBuffer->imagePixelFormat() == Dahua::GenICam::gvspPixelMono8)
{
static bool sbRgbQuadInit = false;
if (!sbRgbQuadInit)
{
for (int i = 0; i < 256; ++i)
{
g_rgbQuad[i].rgbBlue = g_rgbQuad[i].rgbGreen = g_rgbQuad[i].rgbRed = i;
}
sbRgbQuadInit = true;
}
WriteFile(hFile, g_rgbQuad, uRgbQuadLen, &dwWrite, NULL);
}
WriteFile(hFile, (BYTE*)(frameBuffer->bufPtr()), dataSize, &dwWrite, NULL);
CloseHandle(hFile);
int bufsize = -bmpInfoHeader.biHeight*bmpInfoHeader.biWidth * 3;
uchar* buf = new uchar[bufsize];
uchar* reversebuf = new uchar[bufsize];
for (int rows = 0; rows < -bmpInfoHeader.biHeight; rows++)
{
for (int cols = 0; cols < bmpInfoHeader.biWidth; cols++)
{
memcpy(reversebuf + (rows*bmpInfoHeader.biWidth * 3),
buf + ((-bmpInfoHeader.biHeight - rows - 1)*bmpInfoHeader.biWidth * 3),
bmpInfoHeader.biWidth * 3);
}
}
Mat bmpmat1(-bmpInfoHeader.biHeight, bmpInfoHeader.biWidth, CV_8UC3);//定义Mat矩阵
memcpy(bmpmat1.data, reversebuf, bufsize);//复制图像数据
imshow("bmp to mat", bmpmat1);//显示图像