bitmapinfo保存文件问题

huaya1127 2010-11-04 04:03:56
::StretchDIBits
(
lpdi->hDC,
0,
SCREEN_HEIGHT - 1,
SCREEN_WIDTH,
-SCREEN_HEIGHT,
0,
0,
bmpInfo.bmiHeader.biWidth,
bmpInfo.bmiHeader.biHeight,
pBackBuffer,
&bmpInfo,
DIB_RGB_COLORS,
SRCCOPY
);

能用该函数在LPDI->hDC中把图像显示出来,其中BITMAPINFO bmpInfo;char* pBackBuffer;
请问该如何把bmpInfo、pBackBuffer保存成BMP或者JPG文件。谢谢.
...全文
316 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
副组长 2010-11-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 huaya1127 的回复:]
static BITMAPINFO bmpInfo;
static char* pBackBuffer = NULL;
unsigned int BACK_BUFFER_SIZE = 1024 * 1024 * 10; // 10 MBytes
pBackBuffer = reinterpret_cast< char* >( ::HeapAlloc( ::GetProcessHeap(), ……
[/Quote]

你这个能正确显示么?

unsigned int BACK_BUFFER_SIZE = 1024 * 1024 * 10; // 10 MBytes —— 1024*1024的图?10是什么?

bmpInfo.bmiHeader.biSize = sizeof( bmpInfo.bmiHeader ); —— 24位这里应该是 40

bmpInfo.bmiHeader.biSizeImage = 0; —— 这个应该是图像数据字节数,0不行

写的挺乱,先说说症状。



Eleven 2010-11-04
  • 打赏
  • 举报
回复
副组长 2010-11-04
  • 打赏
  • 举报
回复
创建一个新文件,先做一个BITMAPFILEHEADER,把里面的东西填好。写到文件里面,共14字节
再把bmpInfo写到文件里面去,24位真彩只有40字节,就是BITMAPINFOHEADER ,如果有调色板再加上调色板的大小,写到文件里面去。再把pBackBuffer指向的缓存内容写到文件里面去,写多少字节呢?用一个LPBITMAPINFOHEADER指向bmpInfo,找到biSizeImage,就是图像数据的大小。

BITMAPFILEHEADER这样填,
BITMAPFILEHEADER bfhdr;
bfhdr.bfType = 0x4d42;
bfhdr.bfOffBits = BITMAPFILEHEADER的大小 + bmpInfo的大小; //24位彩色是这是54
bfhdr.bfSize = 整个文件的大小;

写完就是一个BMP文件了。

百事烟 2010-11-04
  • 打赏
  • 举报
回复
百度一下吧,这个问题涉及的东西很多,最好是找本书系统来看 图像处理相关的书的基础部分

关键词
bmp文件结构 BITMAPINFO 4字节对齐 调色板 gdi gdi+

如果简单应用 搞明白bmp文件结构就OK,只存24位图
转jpg有N多现成的函数库,直接用
huaya1127 2010-11-04
  • 打赏
  • 举报
回复
能指点下,我哪里写错了吗,是SONY的摄像机的抓图。
huaya1127 2010-11-04
  • 打赏
  • 举报
回复
static BITMAPINFO bmpInfo;
static char* pBackBuffer = NULL;
unsigned int BACK_BUFFER_SIZE = 1024 * 1024 * 10; // 10 MBytes
pBackBuffer = reinterpret_cast< char* >( ::HeapAlloc( ::GetProcessHeap(), HEAP_ZERO_MEMORY, BACK_BUFFER_SIZE ) );
VIDEOINFO videoInfo;
memset( &videoInfo, 0, sizeof(VIDEOINFO) );
videoInfo.pBuf = pBackBuffer;
videoInfo.BufLen = BACK_BUFFER_SIZE;

unsigned int numberOfBytesWritten = 0;
ZeroMemory( &bmpInfo, sizeof( bmpInfo ) );
bmpInfo.bmiHeader.biSize = sizeof( bmpInfo.bmiHeader );
bmpInfo.bmiHeader.biWidth = 0;
bmpInfo.bmiHeader.biHeight = 0;
bmpInfo.bmiHeader.biPlanes = 1;
bmpInfo.bmiHeader.biBitCount = 24;
bmpInfo.bmiHeader.biCompression = BI_RGB;
bmpInfo.bmiHeader.biSizeImage = 0;
bmpInfo.bmiHeader.biXPelsPerMeter = 0;
bmpInfo.bmiHeader.biYPelsPerMeter = 0;
bmpInfo.bmiHeader.biClrUsed = 0;
bmpInfo.bmiHeader.biClrImportant = 0;
HANDLE fh;
BITMAPFILEHEADER bmfHdr;
DWORD dwPaletteSize=0,
dwBmBitsSize,dwWritten;
if ( SNC::GetCurrentDecVideo( m_sncHandle, &videoInfo, &numberOfBytesWritten ) == SNC_OK )
{
bmpInfo.bmiHeader.biWidth = videoInfo.VideoCodecInfo.Width;
bmpInfo.bmiHeader.biHeight = videoInfo.VideoCodecInfo.Height;

dwPaletteSize = 0;

dwBmBitsSize = videoInfo.BufLen;//((videoInfo.VideoCodecInfo.Width * BACK_BUFFER_SIZE+31)/32) * 4 * videoInfo.VideoCodecInfo.Height;
//创建位图文件
fh = CreateFile(_T("C:\\aa.bmp"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
// 设置位图文件头
bmfHdr.bfType = 0x4D42; // "BM"
DWORD dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;
bmfHdr.bfSize = dwDIBSize;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof
(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;
// 写入位图文件头
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
// 写入位图文件其余内容
WriteFile(fh, (LPSTR)pBackBuffer, videoInfo.BufLen,
&dwWritten, NULL);

CloseHandle(fh);

}
ouyh12345 2010-11-04
  • 打赏
  • 举报
回复
分别把头和数据写进文件就成了bmp文件
做个试验,检查一下

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧