32位bmp转24位
------
现在通过截屏从剪贴板得到了一幅32位的bmp,因为要进一步的处理需要转化,请问怎么转成24位的呢 ,有做过的贴一下转化函数,谢谢了
------
没做过,
32位比24位多一位透明度位,找到它,KILL
连续的4个BYTE A,R,G,B,找出A,实际存储应该倒序,一试就出来了
------
楼上你能否把这个函数具体写一些
------
用ACDSee重新转换为BMP格式,就是24位的了。我做过,没错的
------
楼上我还知道用很多软件都行呢 这是什么论坛? 你还没搞清楚意思呢
------
BMP格式 文件头,数据头 调色板(24 32都没这个) 数据(也就是BYTE指针,)
相应修改文件头,数据头 数据(也就是BYTE数组)
需要对BMP格式有所了解,网上资源好多
这其中1个
http://hi.baidu.com/codeworkman/blog/item/af6c8ad0f5b742309a502754.html
------
也可以直接灰度化,即直接转为256色图,把BMP搞个大概就怎么都行了
------
把32位改为24位,然后把32位的a去掉
------
用开源代码opencv
------
8楼你有具体的函数吗,我现在用的比较急 来不及细细琢磨了 大家有具体实现的源码吗
------
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;
}
------
先谢谢楼上 ,运行没问题立刻给分结贴 ,有问题再请教你
------
10楼 你那个代码lpData的类型有些问题 你看下能不能再细化一些
------
嗯,不错。学习了。
------
我记得 编程高手诤言中有讲到 不过那个直接针对图象数据移位实现 原理应该一样
------
顶
------
顶
------
.学知网是个有5000G学习资料的下载网站,注册后可免费下载以下资料:
.[路径]课程大全-工学-工程计算类-有限元-有限元文档-MSC-MSC.ADAMS-adams_talkabout-在ADAMS12.0中如何读入IGES文件?.files
.[地址]http://www.stuknow.com/dirlist/10004/cfcf7df202082d0f9bedf398d9d8224f.htm?popid=fengjianme
------
gbgrbtrbtr
------
学习
------
我只用photoshop转过,用命令真强!
------
1 改变文件大小
2 将图像存储由4个字节改为3个字节
------
顶
------
大家有做的吗 10楼的函数放View里 GetDC()会有点问题
CMainFrame *pMain=(CMainFrame*)AfxGetApp()->m_pMainWnd;
CCharRecView *pView=(CCharRecView *)pMain->GetActiveView();
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(m_hWnd);
HDC hDC=::GetDC(pView->m_hWnd);
// HDC hDC=pView->GetDC();
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(pView->m_hWnd,hDC);
// now ok, 24bit bmp...
return h24;
我这么做的 pview居然是空 大家帮调试一下吧
------
哈...转转弯啊..放view就要有作用域解释放,否则会和CWnd类GetDC()冲突..
HDC hDC = ::GetDC( NULL ); // if view
释放:
::ReleaseDC( NULL, hDC ); // 这样和上面getdc一对..
另外,view本身派生于CWnd..本身就有m_hWnd..this->m_hWnd或者直接m_hWnd都可以..
不用自己get自己ActiveView吧..
------
顶
------
看不太懂
------
看不太懂
------
桂ICP备07017180号