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吧..


------

------
看不太懂
------
看不太懂
------
引用 21 楼 gwemail2003 的回复:

1 改变文件大小
2 将图像存储由4个字节改为3个字节

桂ICP备07017180号