1 20 50 150 500
欢迎来到瑞博软件站,找素材,搜软件,就上瑞博软件站!
当前位置 >首页 >软件下载 >电脑软件 >编程开发 >编程软件

BMP 24位图转16位位图的程序 绿色免费版

软件信息
  • 分类:编程软件
  • 大小:827KB
  • 语言: 中文
  • 环境: WinXP
  • 更新:2024-11-12
  • 评级:
  • 系统: Windows Linux Mac Ubuntu
  • 软件类别: 国产软件 / 免费软件 / 编程辅助
  • 插件情况:
  • 相关链接: http://www.cr173.com

24位BMP图片转565格式16位数组C文件代码,生成的代码用于嵌入式程序代码中图片文件显示,BMP图片以数组的形式保存并读取,将24位位图格式转换为16位位图格式的源代码,包括RGB555格式和RGB565格式。

BMP位图32位转为24位深度

帮朋友做一个视频采集和基本处理功能,要求的是.bmp格式

几天下来,通过directshow进行视频采集,并抓去图片保存,按照要求进行业务处理,以前的处理程序是基于RGB24

而显示器是32位真彩色,后调整directshow 的grab filter,修改媒体类型,pmt->majortype = MEDIATYPE_Video;
 pmt->subtype = MEDIASUBTYPE_RGB24; 结果在业务中效果不理想,为既保留32位图,也生成rgb24位图

硬是将BITMAPINFOHEADER *lpbi 中的值进行强行设置lpbi->biBitCount = 24;

结果是:产生的图片带有间断性的彩色条纹

然后再在谷歌、摆渡中继续游泳,没有实质性进展

无奈,进微软msdn、gdi+...

接下来的两天就是恶补BMP知识,发现彩色条纹应该是RGB32位颜色空间值,对于RGB32与RGB24,它们的像素点空间只差了一个字节,

继而,自行转换数据

首先是从directshow中获取图像数据

其次是,保留获取数据的文件头

然后是转换位图数据内容,并将内容另置空间

最后设定BITMAPFILEHEADER文件头,并写文件,

为备忘,具体实现如下:

 TRY 
 {
 
  BYTE *buffer = NULL; 
  hr = m_pWindowsLessControl->GetCurrentImage(&buffer); //这里 m_pWindowsLessControl为IVMRWindowlessControl,进行图像抓取;
  if (!SUCCEEDED(hr)) 
  {     
   return hr;
  }
 
  BITMAPFILEHEADER hdr;     
  BITMAPINFOHEADER *lpbi = (BITMAPINFOHEADER *)buffer; 
 
  //颜色空间转换,如果为32位位图,转换为24
  DWORD dwSize24 = 0;
  DWORD dwSize32 = lpbi->biSizeImage;
  dwSize24 = (dwSize32*3)/4;   //RGB32与RGB24的像素点空间差一个字节
  BYTE* pImg24 = new BYTE[dwSize24]; //存放RGB24存储空间
  BYTE* pImg24Temp = pImg24;//设定临时指针,后续进行数据管理
  BYTE* pImg32 = buffer + sizeof(BITMAPINFOHEADER);//跳过文件头,定位到数据部分
   bool isSize24 = false;
  if (lpbi->biBitCount==32)
  {
   isSize24 = true;
   for (DWORD index=0; index<dwSize32/4; index++)
   {
    unsigned char r = *(pImg32++);
    unsigned char g = *(pImg32++);
    unsigned char b = *(pImg32++);
    pImg32++;    //跳过颜色空间alpha分量,实现转换
    *(pImg24++) = r;
    *(pImg24++) = g;
    *(pImg24++) = b;   //赋值
   }
   //将指针指向新的控件
   
     lpbi->biBitCount = 24;//强行指定
    }
  
  int nColors = 1 << lpbi->biBitCount;   //按照设定深度,进行颜色计算  
  
  if (nColors > 256)         
   nColors = 0;      
  hdr.bfType = ((WORD)('M' << 8) | 'B'); // 指定BMP

//进行文件头设置    
  hdr.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + nColors * sizeof(RGBQUAD) + lpbi->biSizeImage;    
  hdr.bfReserved1 = 0;     
  hdr.bfReserved2 = 0;     
  hdr.bfOffBits = (DWORD)(sizeof(BITMAPFILEHEADER) + lpbi->biSize + nColors * sizeof(RGBQUAD));  

//进行位图写入    
  FILE *bmpFile = NULL;     
  bmpFile = fopen((LPCTSTR)szFile, "wb");//szFile为文件名     
  if (bmpFile != NULL)     
  {         
   fwrite(&hdr, 1, sizeof(BITMAPFILEHEADER), bmpFile);//位图文件头         
   fwrite(buffer, 1, sizeof(BITMAPINFOHEADER), bmpFile);//位图信息头

   if (!isSize24)
   {
    fwrite(buffer+sizeof(BITMAPINFOHEADER), 1, nColors * sizeof(RGBQUAD), bmpFile);//颜色表         
    fwrite(buffer+sizeof(BITMAPINFOHEADER)+nColors * sizeof(RGBQUAD), 1, lpbi->biSizeImage, bmpFile);//位图数据     
   }
   else
   {
    fwrite(pImg24Temp,1,dwSize24,bmpFile);
   }

  }     
  fclose(bmpFile);      
  CoTaskMemFree(buffer);//释放资源
  delete pImg24Temp; 
  return hr;
 }
 CATCH (CMemoryException, e)
 {
  
 }
 END_CATCH
 }

 折腾了两天,真费劲,特此记录一下备忘

下载地址

热门软件

Top