画像処理ソリューション
これを見れば画像処理の入門から基礎~応用まで全てがわかるのを目指して!
   
翻訳(Translate)

プロフィール

Akira

ニックネーム:Akira
東京都の町田事業所に勤務
画像処理ソフトの開発を行っています。リンクフリーです!
詳細プロフィールは こちら
お問い合わせは、こちら↓

【補助HP】
画像処理ソリューションWeb版 【Newブログ】
イメージングソリューション

スポンサーリンク


カテゴリ

最近のコメント

カレンダー

04 | 2017/05 | 06
S M T W T F S
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -

趣味のブログ

iPhone萬歳!
iPhoneの情報いろいろ。
ブログ学習帳
ブログ、SEO、アフィリエイト情報など(まだまだこれから)
俺流クラフト日記
ハンドメイド作品の記録(現在、放置中)

スポンサーリンク 最近の記事
(09/18)  計測測定展に光切断のデモを出展しました
(08/17)  ディジタル画像技術事典200に記事が載りました
(06/09)  光切断を画像センシング展で公開
(05/14)  中国(上海)へ行って来ました
(04/12)  韓国へ行って来ました
(03/10)  私の求める新人像
(01/18)  エレクトロテストジャパンにカラー光切断法のデモを出展しました。
(12/23)  ユニークアクセス200万達成!
(12/10)  【カラー光切断法】YouTube動画まとめ
(11/04)  国際画像機器展2014にカラー光切断法を出展します。
(10/05)  第25回コンピュータビジョン勉強会@関東に参加してきました。
(09/08)  フーリエ変換の記事を追加しました。
(08/09)  【画像処理】ランキング低下中
(07/06)  記事の更新が停滞中...
(06/08)  画像センシング展2014でカラー光切断法のデモを行います。
(05/17)  カラー光切断法の動画を公開しました。
(04/30)  ソニーα NEX-5Rで星空撮影
(04/10)  カラー光切断法の取込結果を追加しました
(03/08)  Korea Vision Show 2014へ行ってきました
(02/05)  フーリエ変換シリーズを始めます。
(01/06)  2014年、あけましておめでとうございます。
(12/04)  カラー光切断法を公開(国際画像機器展2013にて)
(11/13)  国際画像機器展2013に出展します
(10/14)  「画像処理のためのC#」はじめます。
(09/16)  【C#,VB.NET】高速描画コントロールをバージョンアップしました。
(09/04)  拡大鏡に輝度値表示、ルーラー機能を追加した個人ツールを公開
(08/05)  7月の拍手Top5
(07/06)  2013年6月人気記事Top5
(05/12)  SONY α NEX-5Rレビュー
(04/24)  SONY α NEX-5RY購入

【C++/CLI】Format16bppGrayScaleは使えるのか?実験してみた。

GoogleでFormat16bppGrayScaleを検索してみると、
Format16bppGrayScale not supported だとか、バグだとかの情報が海外のサイトでは多く見受けられ、本当に使えないのか?どこまで使えるのか?
確認してみました。

もし、バグなら最新版で直されているのを期待して、評価環境は以下のとおりです。
■WindowsVista SP1
■Visual C++ 2008 Express Edition
■.NET Framework 3.5

1. 16Bitモノクロビットマップ(ビットフィールド)を開くことはできるか?

評価用に使用したビットマップファイルは
■BITMAPINFOHEADER のbiCompressionがBI_BITFIELDS
■BITMAPINFOHEADER のbiBitCountが16
■カラーテーブル(bmiColors)は3つ確保
で、16Bit中の12Bitおよび16BitをBitfieldで有効にしたビットマップファイルで確認を行いました。

Bitmap^ bmp = gcnew Bitmap(“16Bitのビットマップファイル”);

とすると、bmpは
  PixelFormat はFormat32bppRgb
  Palette->Entries->Length  = 0 
となります。

これを無理矢理

Imaging::BitmapData^ bmpData = bmp->LockBits(rect, Imaging::ImageLockMode::ReadWrite, Imaging::PixelFormat::Format16bppGrayScale);

とすると、

'System.ArgumentException' のハンドルされていない例外が System.Drawing.dll で発生しました。
追加情報: 使用されたパラメータが有効ではありません。


というエラーメッセージが表示されてしまいます。
そこで、

Imaging::BitmapData^ bmpData = bmp->LockBits(rect, Imaging::ImageLockMode::ReadWrite, Imaging::PixelFormat:: Format32bppRgb);

とすれば、Bitfieldで指定したビット中の上位8Bitの輝度値が各R,G,Bに格納されている事が確認できました。
でも、これはやっぱりいまいち・・・

2. 新規にFormat16bppGrayScaleのBitmapを作ることはできるか?

Bitmap^ bmp = gcnew Bitmap(pictureBox1->Width, pictureBox1->Height, Imaging::PixelFormat::Format16bppGrayScale);

エラーはなし。bmpを確認してみると

  PixelFormat はFormat16bppGrayScale
  Palette->Entries->Length  = 0

となりました。
でも、Bitfieldはどこで設定すればいいのだろう???

3. Format16bppGrayScaleのBitmapに輝度値を設定できるのか?

評価用に作成したプログラムは以下のとおり

int BmpWidth = 640;
int BmpHeight = 480;

Bitmap^ bmp = gcnew Bitmap(BmpWidth, BmpHeight, Imaging::PixelFormat::Format16bppGrayScale);
Rectangle rect = System::Drawing::Rectangle(0, 0, bmp->Width, bmp->Height);
//Lock
Imaging::BitmapData^ bmpData = bmp->LockBits(rect, Imaging::ImageLockMode::ReadWrite, bmp->PixelFormat);
UInt16* pBuf = (UInt16*)bmpData->Scan0.ToPointer();
//輝度値の設定
for (int j = 0; j < BmpHeight; j++){
  for (int i = 0; i < BmpWidth; i++){
    pBuf[i + j * bmpData->Stride / 2] = i % 1024;
  }
}
//Unlock
bmp->UnlockBits(bmpData);

エラーはなし。そこで毎度のようにbmpを確認してみると

  PixelFormat はFormat16bppGrayScale
  Palette->Entries->Length  = 0 
  bmpData->Stride = 1280

となりました。
カラーパレット以外は期待通り。輝度値のデータ設定できるようです。

4. Format16bppGrayScaleのBitmapを表示することはできるのか?

Bitmap^ bmp = gcnew Bitmap(640, 480, Imaging::PixelFormat::Format16bppGrayScale);
pictureBox1->Image = bmp;

とすると、

'System.ArgumentException' のハンドルされていない例外が System.Drawing.dll で発生しました。
追加情報: 使用されたパラメータが有効ではありません。


というエラーメッセージが表示されます。
そこで、モノクロのビットマップの表示のときにやったように、DrawImageを使って

Bitmap^ bmp = gcnew Bitmap(640, 480, Imaging::PixelFormat::Format16bppGrayScale);
//PictureBoxと同じ大きさのBitmapクラスを作成する。
Bitmap^ bmpPicBox = gcnew Bitmap(pictureBox1->Width, pictureBox1->Height);
//空のBitmapをPictureBoxのImageに指定する。
pictureBox1->Image = bmpPicBox;
//Graphicsクラスの作成(空のピクチャボックスからGraphicsを作成する)
Graphics^ g = Graphics::FromImage(pictureBox1->Image);
//PictureBoxへBitmapを描画する。
g->DrawImage(bmp, 0, 0);

としてみてもDrawImageのところで同じエラーメッセージが出てしまいました。
ということで、描画は完全にダメっぽい。

5. 個人的な結論

  • 16BitのBitFieldモノクロビットマップファイルは各R,G,Bの輝度値(8Bit)が同じ32Bitのビットマップ(Format32bppRgb)として扱われる。
  • Format16bppGrayScaleのBitmapを作ることはできる。輝度値の設定もできる。でも、Bitfieldは設定できない。
  • Format16bppGrayScaleを表示することはできない。

    ということで、やっぱりBitmapの表示はこれまで親しんできたStretchDIBitsとかのWin32APIを使って表示するしかないのかな~?
    MSDNを見る限り、あたかもできそうなことを書いてありますが、ぜんぜん使えそうにありません。

    どなたか、Format16bppGrayScaleを.NETのみで表示まで行う方法をご存知の方はいらっしゃいますか?
    また、Format16bppGrayScaleはどうやって扱っていますか?
    これまでやったことのある方は教えて下さい。よろしくお願いします。

    参考までに多ビット(10Bit、12Bit)画像データの表示、フォーマット
    のページの最後に部分に評価用サンプルとして10Bitモノクロビットマップファイルを
    置いておきました。

Loading...
スポンサーリンク

この記事に対するコメント
有力情報ありがとうございます。
かもめさん、貴重な情報を頂きありがとうございました。
WPFについては聞いた事はありましたが、まったくの勉強不足なので、教えて頂いたリンクを参考に勉強してみたいと思います。

実は、NETだけでは16Bitグレー画像の表示はできないものだと諦めて、StretchDIBitsを使って作り込もうとしてました...
【2008/08/06 23:29】 URL | Akira #- [ 編集]

WPFにて可能でした
VisualStudio2008(VB)でWPFを用いて画像処理を勉強しています。

WPFのIMAGEならば16BITのグレー画像が表示可能です。
※ただし、対応する拡張子に対してデコードをして読み込まないと32BITになってしまいました。

<参考>
http://msdn.microsoft.com/ja-jp/library/aa970062.aspx
【2008/08/06 22:37】 URL | かもめ #- [ 編集]


この記事に対するコメントの投稿














管理者にだけ表示を許可する


この記事に対するトラックバック
トラックバックURL
→http://imagingsolution.blog107.fc2.com/tb.php/65-ffa3b502
この記事にトラックバックする(FC2ブログユーザー)

現在の閲覧者数: / 合計