新手求助。摄像头采集到的图像,如何保存为bmp啊?

tht228 2011-02-18 10:53:15
现在有一个对话框,我通过图像采集卡将相机采集到的图像实时显示在了对话框上,图像的位置是已知的,假设是(0,0,500,500)。现在想将图像暂停后的瞬时图片保存为256色的BMP图像。求助。
...全文
180 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyingbo 2011-02-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 tht228 的回复:]
引用 5 楼 yfqvip 的回复:

C/C++ code

// lpszFileName:文件名
// saveDC:图片DC
// rc:图片大小
BOOL Save( LPCTSTR lpszFileName, HDC saveDC, RECT rc )
{
BITMAPFILEHEADER bf = { 0 };
BITMAPINFOHEADER bi = { 0 ……
[/Quote]

在视屏显示的回调函数里面可以做
yiruirui0507 2011-02-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 tht228 的回复:]
引用 5 楼 yfqvip 的回复:

C/C++ code

// lpszFileName:文件名
// saveDC:图片DC
// rc:图片大小
BOOL Save( LPCTSTR lpszFileName, HDC saveDC, RECT rc )
{
BITMAPFILEHEADER bf = { 0 };
BITMAPINFOHEADER bi = { 0 ……
[/Quote]

HBITMAP hBitmap = .....;
HBITMAP hOldBmp = (HBITMAP)::SelectObject(memdc,hBitmap);//将上面创建的位图选入内存DC中,返回Bitmap的指针并赋给hOldBmp

tht228 2011-02-18
  • 打赏
  • 举报
回复
补充一点。图像采集卡没有自带的存储图像的函数。。。。
bragi523 2011-02-18
  • 打赏
  • 举报
回复
记得原来我做过一个,是要取一部分,我用抓图做的
百事烟 2011-02-18
  • 打赏
  • 举报
回复
采集卡的SDK有相关的函数,至少会有一个转24位bmp的函数,自己再转下就可以
满衣兄 2011-02-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 tht228 的回复:]
引用 5 楼 yfqvip 的回复:

C/C++ code

// lpszFileName:文件名
// saveDC:图片DC
// rc:图片大小
BOOL Save( LPCTSTR lpszFileName, HDC saveDC, RECT rc )
{
BITMAPFILEHEADER bf = { 0 };
BITMAPINFOHEADER bi = { 0 ……
[/Quote]


HBITMAP hBitmap = .....;
HBITMAP hOldBmp = (HBITMAP)::SelectObject(memdc,hBitmap);//将上面创建的位图选入内存DC中,返回Bitmap的指针并赋给hOldBmp
tht228 2011-02-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yfqvip 的回复:]

C/C++ code

// lpszFileName:文件名
// saveDC:图片DC
// rc:图片大小
BOOL Save( LPCTSTR lpszFileName, HDC saveDC, RECT rc )
{
BITMAPFILEHEADER bf = { 0 };
BITMAPINFOHEADER bi = { 0 };
HDC hMemD……
[/Quote]
可是我现在是从摄像头里采集来的图像,哪来的hdc或者图像指针啊???
满衣兄 2011-02-18
  • 打赏
  • 举报
回复

// lpszFileName:文件名
// saveDC:图片DC
// rc:图片大小
BOOL Save( LPCTSTR lpszFileName, HDC saveDC, RECT rc )
{
BITMAPFILEHEADER bf = { 0 };
BITMAPINFOHEADER bi = { 0 };
HDC hMemDC;
HBITMAP hBitmap;
LPBYTE lpBits;

bi.biSize = sizeof( BITMAPINFOHEADER );
bi.biBitCount = 24; // 保存为true color
bi.biWidth = rc.right - rc.left;
bi.biHeight = rc.bottom - rc.top;
bi.biPlanes = 1;
bi.biCompression = BI_RGB;
bi.biSizeImage = WIDTHBYTES( bi.biWidth, bi.biBitCount ) * bi.biHeight;

HDC hdc = GetDC(NULL);
if( !hdc )
{
return FALSE;
}
hBitmap = CreateDIBSection( hdc, ( CONST BITMAPINFO * )&bi, DIB_RGB_COLORS,( VOID ** )&lpBits, NULL, 0 );
if( !hBitmap )
{
ReleaseDC(NULL,hdc);
return FALSE;
}

hMemDC = CreateCompatibleDC( hdc );
HBITMAP hOldBmp = ( HBITMAP )SelectObject( hMemDC, hBitmap );
BitBlt( hMemDC, 0, 0, bi.biWidth, bi.biHeight, saveDC, rc.left, rc.top, SRCCOPY );
SelectObject( hMemDC, hOldBmp );
ReleaseDC( NULL, hdc );
DeleteDC( hMemDC );

bf.bfType = 0x4d42;
bf.bfSize = sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPINFOHEADER )
+ bi.biSizeImage;
bf.bfOffBits = sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPINFOHEADER );

DWORD dwWrite;
HANDLE fh = CreateFile( lpszFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL );
WriteFile( fh, ( LPBYTE )&bf, sizeof( BITMAPFILEHEADER ), &dwWrite, NULL );
WriteFile( fh, ( LPBYTE )&bi, sizeof( BITMAPINFOHEADER ), &dwWrite, NULL );
WriteFile( fh, ( LPBYTE )lpBits, bi.biSizeImage, &dwWrite, NULL );


DeleteObject( hBitmap );
return TRUE;
}

调用示例:

RECT rc;
rc.bottom = bm.bmHeight;
rc.left = 0;
rc.right = bm.bmWidth;
rc.top = 0;
Save(_T("C:\\A.BMP"),memdc,rc);

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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