西西軟件園多重安全檢測下載網(wǎng)站、值得信賴的軟件下載站!
西西首頁 電腦軟件 安卓軟件 電腦游戲 安卓游戲 排行榜 專題合集

BMP 24位圖轉(zhuǎn)16位位圖的程序

綠色免費版
  • BMP 24位圖轉(zhuǎn)16位位圖的程序綠色免費版
  • 軟件大小:827KB
  • 更新時間:2015-05-27 17:24
  • 軟件語言:中文
  • 軟件廠商:
  • 軟件類別:國產(chǎn)軟件 / 免費軟件 / 編程輔助
  • 軟件等級:3級
  • 應(yīng)用平臺:WinXP
  • 官方網(wǎng)站:http://www.innovatechautomation.com
  • 應(yīng)用備案:
好評:50%
壞評:50%

軟件介紹

24位BMP圖片轉(zhuǎn)565格式16位數(shù)組C文件代碼,生成的代碼用于嵌入式程序代碼中圖片文件顯示,BMP圖片以數(shù)組的形式保存并讀取,將24位位圖格式轉(zhuǎn)換為16位位圖格式的源代碼,包括RGB555格式和RGB565格式。

BMP位圖32位轉(zhuǎn)為24位深度

幫朋友做一個視頻采集和基本處理功能,要求的是.bmp格式

幾天下來,通過directshow進行視頻采集,并抓去圖片保存,按照要求進行業(yè)務(wù)處理,以前的處理程序是基于RGB24

而顯示器是32位真彩色,后調(diào)整directshow 的grab filter,修改媒體類型,pmt->majortype = MEDIATYPE_Video;
 pmt->subtype = MEDIASUBTYPE_RGB24; 結(jié)果在業(yè)務(wù)中效果不理想,為既保留32位圖,也生成rgb24位圖

硬是將BITMAPINFOHEADER *lpbi 中的值進行強行設(shè)置lpbi->biBitCount = 24;

結(jié)果是:產(chǎn)生的圖片帶有間斷性的彩色條紋

然后再在谷歌、擺渡中繼續(xù)游泳,沒有實質(zhì)性進展

無奈,進微軟msdn、gdi+...

接下來的兩天就是惡補BMP知識,發(fā)現(xiàn)彩色條紋應(yīng)該是RGB32位顏色空間值,對于RGB32與RGB24,它們的像素點空間只差了一個字節(jié),

繼而,自行轉(zhuǎn)換數(shù)據(jù)

首先是從directshow中獲取圖像數(shù)據(jù)

其次是,保留獲取數(shù)據(jù)的文件頭

然后是轉(zhuǎn)換位圖數(shù)據(jù)內(nèi)容,并將內(nèi)容另置空間

最后設(shè)定BITMAPFILEHEADER文件頭,并寫文件,

為備忘,具體實現(xiàn)如下:

 TRY 
 {
 
  BYTE *buffer = NULL; 
  hr = m_pWindowsLessControl->GetCurrentImage(&buffer); //這里 m_pWindowsLessControl為IVMRWindowlessControl,進行圖像抓取;
  if (!SUCCEEDED(hr)) 
  {     
   return hr;
  }
 
  BITMAPFILEHEADER hdr;     
  BITMAPINFOHEADER *lpbi = (BITMAPINFOHEADER *)buffer; 
 
  //顏色空間轉(zhuǎn)換,如果為32位位圖,轉(zhuǎn)換為24
  DWORD dwSize24 = 0;
  DWORD dwSize32 = lpbi->biSizeImage;
  dwSize24 = (dwSize32*3)/4;   //RGB32與RGB24的像素點空間差一個字節(jié)
  BYTE* pImg24 = new BYTE[dwSize24]; //存放RGB24存儲空間
  BYTE* pImg24Temp = pImg24;//設(shè)定臨時指針,后續(xù)進行數(shù)據(jù)管理
  BYTE* pImg32 = buffer + sizeof(BITMAPINFOHEADER);//跳過文件頭,定位到數(shù)據(jù)部分
   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分量,實現(xiàn)轉(zhuǎn)換
    *(pImg24++) = r;
    *(pImg24++) = g;
    *(pImg24++) = b;   //賦值
   }
   //將指針指向新的控件
   
     lpbi->biBitCount = 24;//強行指定
    }
  
  int nColors = 1 << lpbi->biBitCount;   //按照設(shè)定深度,進行顏色計算  
  
  if (nColors > 256)         
   nColors = 0;      
  hdr.bfType = ((WORD)('M' << 8) | 'B'); // 指定BMP

//進行文件頭設(shè)置    
  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);//位圖數(shù)據(jù)     
   }
   else
   {
    fwrite(pImg24Temp,1,dwSize24,bmpFile);
   }

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

 折騰了兩天,真費勁,特此記錄一下備忘

把軟件運行確實的庫補全了,需要把庫mfco42d.dll、msvcrtd.dll復(fù)制到C:\Windows\System32

軟件截圖

BMP 24位圖轉(zhuǎn)16位位圖的程序 綠色免費版

其他版本下載

發(fā)表評論

昵稱:
表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
查看所有(0)條評論 > 字數(shù): 0/500

TOP
軟件下載