程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 使用wxWidget中遇到的圖片存儲問題一二

使用wxWidget中遇到的圖片存儲問題一二

編輯:C++入門知識

1. 實驗室中CCD的實際色階為14位,獲取的原始圖像數據的每個值都存儲在一個字中,即存儲色階16位,也就是說最高兩位的數據一直為0,同時獲取的圖片信息僅僅是16色階的灰度圖,而采用wxWidget沒有辦法直接將16位的數值串保存為圖片格式,如tiff格式,那麼如何將16位的數值串以圖片的形式進行保存呢?

    經過這麼幾天的折騰總算是找到了一條解決的途徑,就是將16位的數值串轉化為8為的數值串,也許你會很快的想到這麼一個方法,nValue*max(uint8)/max(uint16);用來表示轉化後的數值,不夠還是得考慮一下CCD的實際色階,由於是14位,因此可以采用這樣的方式nValue*max(uint8)/max(uint14);不過由於我們對於圖片的處理是直接對圖片的原始數據進行處理,而轉化只是圖片在顯示屏上顯示的前提步驟,采用上述的方式雖然能夠相對很准確的進行轉化,但是需要花費一定的計算量,而通過近似的轉化能夠更快的進行這個轉化過程,同時獲取得到的圖片依然具有較好的清晰度,下面細說一下我采用的方法:

   1: unsigned short nPicData16 = new unsigned short[nBufSize];   // nBufSize is the size to store pic
   2: 
   3: // to get the nPicData16
   4: // ..................
   5: // get the nPicData16
   6: 
   7: char *pcPicData8 = new char[nBufSize];
   8: for (size_t i = 0; i < nBufSize; ++i) {
   9:   pcPicData8[i] = (char)(nPicData16>>6);
  10: }
  11: 
  12: 

由於2^6在2^14中所占的比例較小因此可以采用這樣的近似的方法。(這種方法具體有什麼作用或是缺陷還沒有細究,請各位看官給點看法)www.2cto.com

2. 順利將14位數值串轉化成為8為數值串後,嘗試的使用下列方式進行圖片保存,發現結果一片黑,數值都為0了:

   1: // 結果發現存儲得到的save.bmp圖是24b的
   2: wxBitmap bitmap(pcPicData8,1392,1040,8);
   3: bitmap.SaveFile(wxT("save.bmp"),wxBITMAP_TYPE_BMP);
   4: 

因此猜想wxWidget對直接獲取的數據串進行保存時采用的rgb的模式進行保存,可能只會保存為24字節格式的圖片,也就是想要將圖片顯示到屏幕上時,也應該采用24b的圖片。不過wxWidget對於圖片數據卻能夠讀取8位的圖片,但是再次采用上述的方式進行存儲時,變成了32字節的了,(各位大蝦知不知道有沒有方法能夠直接保存8位圖的呢)。

於是采用了將這個8位的數值串分別賦值給R,G,B,用這種方式實現灰度圖的創建,然後再進行保存,最終解決了問題。

   1: unsigned char *rgbData = new unsigned char[1392*1040*3];
   2: unsigned char *ptr1 = (unsigned char*) pcPicData8;
   3: unsigned char *ptr2 = rgbData;
   4: for (int i = 0; i < 1392*1040; ++i) {
   5:     *ptr2++ = *ptr1;  
   6:     *ptr2++ = *ptr1;
   7:     *ptr2++ = *ptr1++;
   8: }
   9: wxImage myImage(1392,1040,rgbData);
  10: myImage.SaveFile(wxT("save.bmp"),wxBITMAP_TYPE_BMP);


作者:鐘謝偉

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved