WxWidgetで発生したピクチャストレージの問題を使用する

3633 ワード

WxWidgetで発生したピクチャストレージの問題を使用する
1.実験室のCCDの実際の色レベルは14ビットで、取得した元の画像データの各値はすべて1つの字の中で記憶して、つまり色レベル16ビットを記憶して、つまり最高2ビットのデータはずっと0で、同時に取得した画像情報はただ16色レベルの階調図で、wxWidgetを採用して直接16ビットの数値列を画像フォーマットに保存することができなくて、例えばtiffフォーマット、では、16ビットの数値列を画像の形で保存するにはどうすればいいのでしょうか.
ここ数日の振り回されてやっと解決策を見つけたのは、16ビットの数値列を8の数値列に変換することだ.nValue*max(uint 8)/max(uint 16)という方法をすぐに思いつくかもしれない.変換後の数値を表すには、CCDの実際の色次を考慮しなければならない.14ビットであるため、nValue*max(uint 8)/max(uint 14)を採用することができる.しかし、画像の処理は直接画像の元のデータを処理するため、変換は画像がディスプレイに表示される前提ステップにすぎないため、上述の方式では比較的正確に変換することができるが、一定の計算量を費やす必要があり、近似的な変換によってこの変換過程をより速く行うことができる.同時に取得した画像は依然として鮮明度が高く、以下に私が採用した方法を詳しく説明します.
   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に占める割合が小さいため、このような近似法を用いることができる.△この方法は具体的にどのような役割や欠陥があるのか、まだ詳しくは明らかにされていません.
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バイト形式のピクチャしか保存されない可能性があり,すなわちピクチャを画面に表示したい場合にも24 bのピクチャを採用すべきであると考えられる.しかし、wxWidgetは画像データに対して8ビットの画像を読み取ることができたが、再び上記のように記憶すると32バイトになった.
そこで,この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);