自分で調べているような時間もないため
くだらないことかとは思いますが、ここで質問させてもらいます。
現在BMP画像データに関するプログラムを作成しています。
ざっくりと説明しますと
必要なBMP画像データを全てつなげて一つのバイナリファイルとして保存しており。
そのデータをBMPヘッダー情報にあるファイルサイズを読み取ってセットして、バイナリファイルとファイルサイズ情報を相手方に送信します。
そのファイルサイズ情報をもとにデータを切り取って画像を復元してもらうような流れなのです。
現状作成しているプログラムで今のところ問題なく動作しているのですが。
BMPファイルのフォーマットについてよく調べてみたところ
ヘッダーにあるファイルサイズ情報は信用できない値だと分かりました。
ためしに画像のファイルサイズ情報を0に変えてみて、保存してみたところ
普通に画像が表示されたため、信用性がないことが確認できました。
しかし、現在作成しているプログラムはここの値が間違っていると正常に動作しない仕組みになっていて、自分の目でデータを見比べてみても
ヘッダーに入っている情報は正しい値となっていました。
このBMP画像はC#で作成したプログラムで1bppの白黒画像を保存しています。
ヘッダー情報などには特に手は加えておらず。
C#
1 //1bppイメージを作成する 2 Bitmap newImg = new Bitmap(img.Width, img.Height, 3 PixelFormat.Format1bppIndexed); 4 5 //Bitmapをロックする 6 BitmapData bmpDate = newImg.LockBits( 7 new Rectangle(0, 0, newImg.Width, newImg.Height), 8 ImageLockMode.WriteOnly, newImg.PixelFormat); 9 10 //新しい画像のピクセルデータを作成する 11 byte[] pixels = new byte[bmpDate.Stride * bmpDate.Height]; 12 for (int y = 0; y < bmpDate.Height; y++) 13 { 14 for (int x = 0; x < bmpDate.Width; x++) 15 { 16 //明るさが0.5以上の時は白くする 17 if (0.5f <= img.GetPixel(x, y).GetBrightness()) 18 { 19 //ピクセルデータの位置 20 int pos = (x >> 3) + bmpDate.Stride * y; 21 //白くする 22 pixels[pos] |= (byte)(0x80 >> (x & 0x7)); 23 } 24 } 25 } 26 27 //作成したピクセルデータをコピーする 28 IntPtr ptr = bmpDate.Scan0; 29 System.Runtime.InteropServices.Marshal.Copy(pixels, 0, ptr, pixels.Length); 30 31 //ロックを解除する 32 newImg.UnlockBits(bmpDate); 33 34 35 36 // bmpをバイナリデータに変換 37 System.IO.MemoryStream ms = new System.IO.MemoryStream(); 38 newImg.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); 39 byte[] bmpbindate; 40 bmpbindate = ms.ToArray(); 41 ms.Close(); 42 43 System.IO.FileStream fs = new System.IO.FileStream(cardbinarypath, System.IO.FileMode.Append, System.IO.FileAccess.Write);
このような感じで生成した画像を1bppのピクセルデータを作成して
それをバイナリとして保存しております。
(DOBON.NET様のコードをお借りしております。)
前置きが長くなってしまいましたが。
私が知りたいのは、Visual Studioの仕様?.NETFrameworkの仕様?
でBMPヘッダー情報のファイルサイズに正しいデータをセットする仕様となっているかどうかを知りたいです。
BMPクラスやBMPヘッダー関係の構造体の説明を読んでみてもそれらしい記述が見つかりませんでした。
BMPヘッダーのファイルサイズ情報の信頼性がほしいためこのような仕様があることがわかる方、もしくはそのような文章を知っている方は教えていただけるとありがたいです。
よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/25 08:03
2016/11/25 08:18 編集
2016/11/25 08:22
2016/11/25 08:26
2016/11/25 08:28
2016/11/25 09:01
2016/11/28 06:22