关于mobile Directshow摄像头拍摄图像保存bmp图片
最近写了一个关于mobile Directshow摄像头拍摄图像保存bmp图片的程序,可是我的pda取得到的位图是32位的160*120的图片,可是我想要得到的是24位的176*144的bmp图片,我该怎么做呢?
[解决办法]
C#的话转换得需要PixelFormat.Format24bppRgb,但该属性在WM上不支持。
下面是C++的方法,楼主参考下吧
HBITMAP ConvTo24Bit( HBITMAP h32 ) { BITMAP bm; GetObject( h32, sizeof( BITMAP ), &bm ); BITMAPINFOHEADER bi = { 0 }; void *pBits; bi.biSize = sizeof( BITMAPINFOHEADER ); bi.biBitCount = 24; bi.biPlanes = 1; bi.biWidth = bm.bmWidth; bi.biHeight = bm.bmHeight; HDC hDC = GetDC( NULL ); HBITMAP h24 = CreateDIBSection( hDC, ( LPBITMAPINFO )&bi, DIB_RGB_COLORS, &pBits, NULL, 0 ); HDC hMemDC1 = CreateCompatibleDC( hDC ); HDC hMemDC2 = CreateCompatibleDC( hDC ); HBITMAP h32Old = ( HBITMAP )SelectObject( hMemDC1, h32 ); HBITMAP h24Old = ( HBITMAP )SelectObject( hMemDC2, h24 ); BitBlt( hMemDC2, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC1, 0, 0, SRCCOPY ); SelectObject( hMemDC1, h32Old ); SelectObject( hMemDC2, h24Old ); DeleteDC( hMemDC1 ); DeleteDC( hMemDC2 ); ReleaseDC( NULL, hDC ); // now ok, 24bit bmp... return h24; // 或者改return HBITMAP为BYTE * DWORD dwImageSize = ( ( ( ( bm.bmWidth * 24 ) + 31 ) >> 5 ) < < 2 ) * bm.bmHeight; LPBYTE lpData = ( LPBYTE )new BYTE[sizeof( BITMAPINFOHEADER ) + dwImageSize]; memcpy( ( LPBITMAPINFOHEADER )lpData, &bi, sizeof( BITMAPINFOHEADER ) ); memcpy( ( LPVOID )lpData + sizeof( BITMAPINFOHEADER ), pBits, dwImageSize ); DeleteObject( h24 ); return lpData; }
[解决办法]
在CComPtr<IAMStreamConfig>里面用GetNumberOfCapabilities去拿设备支持的resolution
他支持什么 你就可以取到什么 我指的是分辨率
[解决办法]
7楼正解:
使用IAMStreamConfig这个接口。 获得这个接口之后,通过GetNumberOfCapabilities获得stillpin或者capturepin(哪个pin这个由你获得这个接口的时候自己申明)的所支持的功能种类的数量。 再通过GetStreamCaps获得具体的值(如,分辨率,bitcount)。
具体你看下mobile帮助文档。
[解决办法]
呵呵..
如果你一定要得到你指定的分辨率,看来你只能自己做bmp的转换了。