新手求助。摄像头采集到的图像,如何保存为bmp啊? 现在有一个对话框,我通过图像采集卡将相机采集到的图像实时显示在了对话框上,图像的位置是已知的,假设是(0,0,500,500)。现在想将图像暂停后的瞬时图片保存为256色的BMP图像。求助。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 采集卡的SDK有相关的函数,至少会有一个转24位bmp的函数,自己再转下就可以 // 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); 可是我现在是从摄像头里采集来的图像,哪来的hdc或者图像指针啊??? HBITMAP hBitmap = .....;HBITMAP hOldBmp = (HBITMAP)::SelectObject(memdc,hBitmap);//将上面创建的位图选入内存DC中,返回Bitmap的指针并赋给hOldBmp HBITMAP hBitmap = .....;HBITMAP hOldBmp = (HBITMAP)::SelectObject(memdc,hBitmap);//将上面创建的位图选入内存DC中,返回Bitmap的指针并赋给hOldBmp CPropertyPage,CPropertySheet怎么监听键盘? C/C++是强类型语言还是弱类型语言,参与讨论都给分 组合框 学windows驱动程序开发应看什么书最好? 用nsis打包时如何获得安装文件名称 Visual C++如何访问USB 关于图形缩放请帮忙。。。 200分的问题,有字符集处理经验的兄弟请进 如何修改用Serialize保存的文件的后缀名? 哪里可DOWN到HOOK SDK 哪儿有好的MSDN,求教…… 关于通过临界区进行线程同步的问题
// 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);
HBITMAP hOldBmp = (HBITMAP)::SelectObject(memdc,hBitmap);//将上面创建的位图选入内存DC中,返回Bitmap的指针并赋给hOldBmp
HBITMAP hBitmap = .....;
HBITMAP hOldBmp = (HBITMAP)::SelectObject(memdc,hBitmap);//将上面创建的位图选入内存DC中,返回Bitmap的指针并赋给hOldBmp