質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

1回答

6219閲覧

Visual C#のBMP画像について

tuyudaku

総合スコア75

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2016/11/25 07:49

自分で調べているような時間もないため
くだらないことかとは思いますが、ここで質問させてもらいます。

現在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ヘッダーのファイルサイズ情報の信頼性がほしいためこのような仕様があることがわかる方、もしくはそのような文章を知っている方は教えていただけるとありがたいです。

よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

この辺は既にご覧になりましたか?
BMPファイル仕様 / バイナリ構造

まぁ結論から言うとある程度自由に書けるみたいですが。

投稿2016/11/25 07:54

ishi9

総合スコア1294

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tuyudaku

2016/11/25 08:03

回答ありがとうございます。 >ファイルサイズ(4バイト) >BMPファイル全体のバイト単位でのサイズが符号無し整数値で入る。 >ただし、厳密でないエンコーダはこの値を計算せずに 0 を格納しても構わない。 >デコーダはこの値を利用する必要はなく、また信用するべきでもない。 上記のような記述を確認したのですが 現状、ファイルサイズのところに正しい値が入ってる以上 は厳密なエンコーダーと解釈していいのでしょうか...
ishi9

2016/11/25 08:18 編集

全てに厳密な値を入れる必要はありません。必要な箇所だけ厳密な値を入れるのもありです。 一箇所だけ厳密な値が入っていたから、他の箇所も厳密な値が入っていると信用するのは早計です。 とはいえ、元を正せばmicrosoft(とIBM)の用意した形式ですからね。 https://ja.wikipedia.org/wiki/Windows_bitmap 私なら必要な分の箇所が問題無さそうなら信用しちゃいますね。
tuyudaku

2016/11/25 08:22

そうですね、今のところ問題なく動作しているため 現状は信用できるとしたいところです。 何とか、これで上司を説得できるか考えてみます...w 回答ありがとうございました。
ishi9

2016/11/25 08:26

あ、そういう事情ならもう少し調べてからの方がいいと思います。
tuyudaku

2016/11/25 08:28

で、ですよね...
tuyudaku

2016/11/28 06:22

わざわざありがとうございます! 何とか頑張って調べてみたいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問