カレンダー

04月 │2017年05月│ 06月
- 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 - - -

 プロフィール

はしもと

Author:はしもと
ユーザインタフェース系のお仕事をしてます.関心領域は画像処理,拡張現実感,ヒューマンコンピュータインタラクション,エンタテインメントコンピューティングあたり.モノ書きもやってます.

 工学ナビ

工学ナビは工学系の技術のチュートリアルを扱うサイトです.

 作ったもの

 Twitter

 

 天気予報


 ブログ内検索

 カテゴリー

最新コメント

 RSSフィード

 リンク

このブログをリンクに追加する




工学ナビの中の人 はしもとのブログです. いろんなコトを研究的,工学的な視点で見つめます.
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

BMP画像比較 : PhotoShop VS ペイント
たまには工学系のはなしを.

 画像処理プログラミングをはじめるときは多くのひとがビットマップ画像(*.bmp)から入門することだと思います.Windowsであればペイントなどで簡単に作れるし,画素情報がそのまま並べられているという構造なので割と解析しやすい.しかしフォーマットが結構いい加減なところもあるので,読み書き関数を自作する場合は注意が必要です.今日はその事例を紹介したいと思います.

注) 「いまどきBMP読み書き関数なんか自作しないよねぇー キモーイ」って人は読む必要ないかも.

【ク○イジークレイマー】
 去年僕がC++で作ったBMP処理関数ライブラリにクレームがきたとです.
おかしいな.なぜいまごろになって?

先輩「Vixで吐いたBMPが読めんよ」
後輩「PhotoShopで吐いたBMPが読めません」

対するサポートセンター,

僕 「IrfanViewとペイントで吐いたBMPは読めますが,何か」
相手「ガチャン ツーツーツー」

あ,どうせならサポセンらしく「仕様です」が良かったかな.
というのは冗談で,技術屋の意地があるので奴らに解析される前に
自分で直すぞ,と. さっそく原因を確認するべく解析開始.

【方法】
 背景を (R,G,B) = (170,187,204) で塗りつぶした縦5px,横5px
の24bitRGB画像をPhotoShopとペイントでそれぞれ作成.それを
バイナリエディタで比較.色は16進数で見ると画素部分がB,G,R
の順でCCBBAAと並んで見やすいのでこの値.

【結果】
PhotoShopで出力したBMP画像の解析結果↓
フォトショップで出力した画像の解析結果

ペイントで出力したBMP画像の解析結果↓
ペイントで出力した画像の解析結果

赤色の箇所が値が異なる場所です.ちなみにCCBBAAというセットが1画素分のデータになります.上の方はヘッダ領域です.

【考察】
 アドレスとそこに書いてある値の意味の対応関係はこのページを見るとわかりやすい.
2つの画像で異なる箇所は以下のような場所.

[アドレス]:構造体メンバ:意味
-----------------------------------------------------
[0002]:BfSize        :ファイルのバイト数
[0022]:BiSizeImage    :ビットイメージバイト数
[0026]:BiXPelsPerMeter :ターゲットデバイスの水平解像度
[002A]:BiYPelsPerMeter :ターゲットデバイスの垂直解像度

デバイスの解像度はさほど問題にならないのでこの際無視する.
ファイルサイズが異なるのはどうやらケツに余計(?)なゼロ領域が
2byteついてるかついてないかの違いのようだ.そしてBiSizeImageが
PhotoShopの場合は0(byte),ペイントの場合は50(byte)になっている.

【バグの原因は】
 画像データ部分のサイズ情報を格納したbiSizeImageというメンバの値を
あてにしてメモリ確保してたのが原因.PhotoShopのBMP画像を読み込もう
とすると,0byteの領域を確保(笑)した上で画像データを読み込んでしまう
のであえなく撃沈.つかそりゃ危険だ.これによると,biSizeImage=0のことも
あるようです.ちなみにVixが出力するBMPもPhotoShopと同様の仕様でした.

___
 まったく,不勉強な自分を呪いましたよ.以上,各種ファイルを読み書きする
プログラムを作るときにはいろんなパターンを考慮したほうがいいですよという
教訓でした.オワリ.

【おまけ】
 *失言小町*というBlogで『Photoshopのメモリ節約技術を推測する
という大変興味深い記事が連載されています.僕のようなヘタレが書く
画像処理の話題よりもずっと面白い内容なんで是非読んでみて下さい.
 # Ryokoさん,第4回楽しみにしていますよ!

この記事に対するコメント
どーも
こんにちわ。いつも楽しく拝見させてもらってます。
学校でBMP画像に関する課題が出たので参考にさせてもらいました。
BMPはけっこう簡単なデータからなるんですね。
【2005/12/21 17:45】 URL | anti_wave #eqP7eH0Y [ 編集]


>anti_waveさん
こんにちは.いつもありがとうございます.
BMPは結構ベタなデータフォーマットなので
意外と簡単に読み書きのプログラムが作れますよ.
この記事の件では痛い目みましたが・・・
【2005/12/22 04:42】 URL | なおき #F54KmX5Y [ 編集]

コメントありがとうございます。
私の場合、(すごく初歩的な)読み書き関数を作成した際、読み込むデータの箇所が
ひとつずれた為、予想しない動作をして大変悩みました。
結局、freadとgetcを混ぜて使っていたのが原因とわかりました。
でも、画像処理に興味が湧いちゃいました('3')
【2005/12/22 13:50】 URL | anti_wave #eqP7eH0Y [ 編集]




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














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


この記事に対するトラックバック
トラックバックURL
→http://kougaku.blog28.fc2.com/tb.php/27-7b42d0fe
この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。