• ベストアンサー

BMPのフォーマットの詳細について教えてください!

BMP(といってもいくつかありますねぇ・・) とりあえず、Windowsの独立DIBのBMPで、 RLE圧縮されていないバージョンのBMPのフォーマット(というか仕様?)、 に関する情報、を探しています。 例えば、私がGIF連結システムを作ったときに 参考にさせていただいた仕様は次のようなものでした。 GIF Header Offset Length Contents 0 3 bytes "GIF" 3 3 bytes "87a" or "89a" 6 2 bytes <Logical Screen Width> 8 2 bytes <Logical Screen Height> 10 1 byte bit 0: Global Color Table Flag (GCTF) bit 1..3: Color Resolution bit 4: Sort Flag to Global Color Table bit 5..7: Size of Global Color Table: 2^(1+n) 11 1 byte <Background Color Index> ・・・などなどなど でした。 こういう感じで、BMPのフォーマット仕様書ってネット上にころがってないでしょうか? とりあえず必要なのは、どこのバイナリデータが何を示しているのか? という情報です。 やりたいことは、BMPのパレット番号を(画像を維持したまま) 切りかえるコマンドツールの作成、もしくは同様のコマンドラインツールの入手です。 (今は普通のWindowsツールで、そのツールでは、操作の都合上、連続処理することが出来ないのです) 数百個のBMP画像ファイルのパレット番号を機械的に入れ替えたいので そのようなツールの作成、もしくは入手をもくろんでいます。 いろいろな角度からの解決法を提供していただいても結構です。 Perlで、GDなどを使って簡単に解決できるよ!というご意見や、 C/C++ライブラリでこのように書けば・・・というご意見、 などなどでも結構です。 よろしくお願いします m(_ _)m

質問者が選んだベストアンサー

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.3

ビットマップの構造かぁ。学生の頃にやった覚えがあります(笑)  VC++をお持ちなら、BITMAPFILEHEADER構造体、BITMAPINFO構造体(中にBITMAPINFOHEADER構造体とRGBQUAD構造体配列が入っています)を調べるといいですよ。各構造体の中身は↓な感じです。 BITMAPFILEHEADER:  Offset Length Contents     0    2   ASCIIコードで"BM"     2    4   ファイルサイズ(Byte)     6    2   予約済み:必ず0     8    2   予約済み:必ず0    10   4   ファイル先頭から、イメージデータまでのオフセット(Byte) BITMAPINFO:  BITMAPINFOHEADER  RGBQUAD     ※要素1つの配列 BITMAPINFOHEADER:  Offset Length Contents     0    4   この構造体のサイズ     4    4   画像の横幅(Pixel)     8    4   画像の高さ(Pixel)            符号でイメージの格納形式が変わります。            正:bottom-up 負:top-down    12    2   必ず1    14    2   色数(Bit)    16    4   圧縮の種類    20    4   イメージのサイズ(Byte)    24    4   水平解像度(pixels/meter)    28    4   垂直解像度(pixels/meter)    32    4   使用するカラーインデックス数    36    4   重要なカラーインデックス RGBQUAD:  Offset Length Contents     0    1   青の輝度     1    1   緑の輝度     2    1   赤の輝度     3    1   必ず0  実際にはBITMAPFILEHEADER、BITMAPINFOHEADERまではどのBMPファイルでも同じですが、RGBQUAD以下の部分は色数によって構造が変わります。 ●カラーテーブルを利用している場合(1,4,8bit形式)は、パレット数分のRGBQUAD構造体が並び、その下にイメージデータ(パレットIndex配列)が入ります。 ●カラーテーブルを利用しない場合(16,24,32bit形式)でも、BITMAPINFOHEADERの「使用するカラーインデックス数」が0でない場合、その数の最適化カラーパレットが存在します。 ●24bit形式の場合、RGB1byteずつの3byteで1pixelを表します。圧縮タイプは必ず0になります。 ●16,32bit形式の場合、圧縮タイプによりデータの構造が変わります。圧縮の種類には、    0:非圧縮 1:8bit用ランレングス 2:4bit用ランレングス 3:非圧縮だがカラーマスクが指定されている があります。  ○0の場合、RGBQUADの位置からイメージデータが配置されます。   16bitでは最上位1bitが無視され、5bitずつRGBの順に使用されます。   32bitでは上位1byteが無視され、1byteずつRGBの順に使用されます。  ○3の場合、RGBQUADの位置から、4byteのカラーマスクが3つRGB順に配置され、その後にイメージデータが続きます。   最適化カラーテーブルが存在する場合、カラーマスクの直後に配置されます。   カラーマスクの値には、WindowsNT/2000とWindows95/98で、異なる制限があります。  イメージデータは、1ラインごとにlong境界に合わせなければならないため、1ラインのデータがlong境界に満たない場合は、隙間はNULLで埋められます。 ※BMP/DIBフォーマットにはWindows形式とOS/2形式があり、ここに書いたものはWindows形式になります。  両者の違いはヘッダの構造体だけで、基本的な構造は変わりません。

kokucho81
質問者

補足

leaz024 さんこんにちわ。 これは、うまく詳細に知りたいところをわかりやすい形にしていただいたと言う感じです。 こんなに詳しく書いていただいて、本当に痛み入ります。m(_ _)m これだけ様々な情報をいただければ、充分解決しますが、 意外な観点からの解決法を述べられる方がおられるかもし れないので、とりあえず、もう少し締め切りを待とうと思います。 重ね重ね、詳しく教えていただきありがとうございました。

その他の回答 (3)

  • KojiS
  • ベストアンサー率46% (145/312)
回答No.4

VC++を持っているなら、MSDNと VCのヘッダファイルを調べればだいたいわかると思います。 MSDNもキーワードでいろいろ検索すればいろいろ出てきますし。 以前仕事で DOSで作った時はヘッダだけでなんとかなりましたよ。(圧縮されているものは面倒ですが。) 一度適当なサンプルを作ってみると良いと思います。 (ただ表示するだけのものとか)

回答No.2

Microsoft の Visual Studio とか MSDN とかに記述されていると思います。 全部引用するわけにはいきませんが、 typedef struct tagBITMAPINFOHEADER{ // bmih DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; } BITMAPINFOHEADER; typedef struct tagBITMAPINFO { // bmi BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[1]; } BITMAPINFO; BITMAPINFOHEADER構造体がヘッダ情報で RGBQUAD構造体が実際のビット列を表します。 ですから、RGBQUAD構造体のビットマップのサイズによってレコード数が可変になるということになります。 最近 bmp を扱うプログラムをやってませんので忘れてしまいましたが、ヘッダ情報のところに次のような記述があるので、ヘッダもいくつかあるようですね。 >Windows NT 3.51 and earlier: Use the BITMAPINFOHEADER structure. > >Windows NT 4.0 and Windows 95: Use the BITMAPV4HEADER structure. > >Windows 98, Windows NT 5.0 and later: Use BITMAPV5HEADER structure. >BMPのフォーマット仕様書ってネット上にころがってないでしょうか? 正式なものが、ちょっとどこにあるかは分かりませんがBITMAPINFOHEADERをキーワードにして goo で検索したら 300以上でてきましたよ。

kokucho81
質問者

補足

SpiralGalaxy さん、こんにちわ。 おかげさまの情報で、大体BMPの構造が理解できました。 バイナリを見てわかりそうな程度なので、これなら 充分なんとかなりそうです。 (GIFの場合は、肝心のIMAGEデータ部の圧縮がさっぱり意味不明で泣きましたが、 それに比べれば、IMAGEデータ部がカラーテーブルのインデックスを 指してるだけ(フルカラーでなければ)っぽいので、かなり簡単そうです。 パレットの入れ替えはパレットの並びの入れ替えと、イメージのインデックス値の 入れ替えで大体終わるのではないか? とい考え方でいけそうなので、 やってみようと思います。 貴重な情報ありがとうございました。

  • KojiS
  • ベストアンサー率46% (145/312)
回答No.1

開発ツールは何を使っていますか? MSDN等で「Bitmap Structures」がありますので調べましょう。

kokucho81
質問者

補足

KojiSさん、さっそくのご回答ありがとうございます。 えーと、普段はVC++は使ってないのですが、 一応 VC++ エンタープライズはあります。 Bitmap Structures みてみました。 うーむ。わかるようなわからないような。。。 そこで、BMPファイルの中身をみてみたのですが、、、 肉眼で読めました〔笑 これかんたんなのですね・・・ GIFのときは肉眼では全然不明で仕様を読んで ようやくわかったのですが、 BMP、バイナリ肉眼で読めますねこれ・・・ (まぁ、だからこそDIBなのかもしれないですが・・・) とりあえず、貴重な情報ありがとうございました。 フォーマットがかなり簡単そうなので、これなら何とでもなりそうです。

関連するQ&A

  • DIBフォーマットの読み込みとそれを元にBMPを画面へ表示する方法について

    現在DirectDrawスケルトンでDIBフォーマットを元にBMPデータを取り出して、 そのデータを元に画面に表示するまでのプログラムを勉強しています。DIBフォーマットの構造については理解したのですが、取り出したBMPデータのイメージデータ部分をどこにどう設定してどのような手順を踏んでいけば画面にBMPを表示できるのかわかりません。BMPデータを取り出してから画面に表示するまでの流れなどをわかる方がいらっしゃいましたらぜひ教えていただきたいです。 DIBフォーマットの形式は8bitで256色パレットを使用します。 別でパレットをロードする関数は自作してあるので、ヘッダを読み込んだ後はカラーテーブルをとばしてイメージデータを読み込むやり方にしようと思っています。 そこでパレットとイメージデータの各ピクセルが持つインデックス番号を関連づける方法も教えていただけるとありがたいです。 よろしくお願いします。

  • bpsとB/sの読み方は?

    よろしくお願いいたします。 パーツの仕様書でbpsとかB/sとか記載があり、意味は分かるのですが読み方が分りません。 bitにしろByteにしろ「s」をつけるのが正しいのでしょうか? なにか決まりはあるのでしょうか? bpsは「bit per second」なのか「bits per second」なのか? B/sは「byte per seconde」「bytes per seconde」なのか? なにか根拠になる資料があればうれしいです。

  • 教えて!Gooにログインできないのは?

    先日、auからウェブパレットを頂き、使っていますが、 ここから教えて!gooへのログインをすると、またログイン画面に戻り、ログインが出来ません。 コミュニティの方は何の支障もなくはいれるのですが 両者の間に何か違いや制約があるのでしょうか? 参考までに、ウェブパレットの仕様を書いておきます。 SSL3.0対応 HTML3.2準拠 動画、音声の再生不可 対応画像形式 GIF、アニメーションGIF、JPEG、BMP Javascript、JAVA非対応 Cookie受け取り不可 プラグインアプリケーション非対応 以上です。 よろしくお願いします。

  • java 画像ファイル

    下記のプログラムは読み込んだファイルの拡張子を表示するプログラムの一部なのですが,コマンドライン引数で指定したファイルがPNG形式の時だけエラーが出ます.ほかの判定を消してPNG判定だけにするとエラーがでないので if の書き方に問題があるのではないかと思うのですが何がいけないのでしょうか? while (((ch = bis.read()) != -1)) { /*GMP判定*/ if((byte)ch == BMP_SIGNATURE[k]) { flg1++; if(flg1 == BMP_SIGNATURE.length) { System.out.println(args[0] + "はBMP形式のファイルです."); break; } } /*JPEG判定*/ else if((byte)ch == JPEG_SIGNATURE[k]) { flg2++; if(flg2 == JPEG_SIGNATURE.length) { System.out.println(args[0] + "はJPEG形式のファイルです."); break; } } /*PNG判定*/ else if((byte)ch == PNG_SIGNATURE[k]) { flg3++; System.out.println(flg3); if(flg3 == PNG_SIGNATURE.length) { System.out.println(args[0] + "はPNG形式のファイルです."); break; } } /*GIF判定*/ else if((byte)ch == GIF_SIGNATURE[k]) { flg4++; if(flg4 == GIF_SIGNATURE1.length) { System.out.println(args[0] + "はGIF形式のファイルです."); break; } } k++; }

    • ベストアンサー
    • Java
  • photoshopでテキストカラー「?」となり反映されない

    photoshopでテキストカラー「?」となり反映されない Windows7(64bit)/PhotoshopCS4(32bit)での利用者です。 Photoshopでテキストを編集するため、テキストツールでカーソルを合わせた瞬間、 文字パレットのカラーが「?」になり、色が消えます。 テキスト自体は編集可能で、 編集後選択ツールに切り替え選択しなおし、 文字パレットのカラーを再設定すればカラーが反映されます。 しかし、編集時にまた同じ現象が起こります。 ※レイヤー効果のカラーオーバレイも反映されません。 下記URLにあるように、 環境設定ファイルの初期化も試しましたが、ダメでした。 http://okwave.jp/qa/q2881598.html 他に改善策はありますでしょうか? 急を要しているため、早急にご回答頂ければ幸いです。

  • Illustrater10で選択ツールで文字を指定し、色を変えようとし

    Illustrater10で選択ツールで文字を指定し、色を変えようとしたら変えられません。 カラーパレットの数値が変化しても、実際の文字色は何も変化ありません。 文字ツール「T」で、中の文字を反転させてからでないと、色が変えられないのです。 Illustrater10は、こういう仕様なのでしょうか? Illustrater8は、こんなことなかったです。 まとめて一気に色を変えることができないなんて、不便で仕方ありません。 どうか、お知恵のほどよろしくお願いします。よろしくお願いします。

  • Windows7とCentOS6.2のDual B

    Windows7とCentOS6.2のDual bootしようといろいろやっていますが、上手くいきません。 HDDは、raid0で2つの1Tがつながっています。(2Tが品薄でなかったらしい。) WBMでは、Windows7とGrub4dosを選択するようにしましたが、Grub>からCentOS6.2をbootすることができません。おそらく、CentOS6.2をインストールはしたものの、/boot/grubホルダの中に、 initramfsがないのがおかしいのかなと思います。 /bootは、md126p7になっています。 md126というのは、md0などに直した方がいいのでしょうか。 fdisk -lの結果は以下のとおりです。 解決策をお教え頂ければ幸いです。よろしくお願いします。 [root@livecd centoslive]# fdisk -l Warning: invalid flag 0x0000 of partition table 5 will be corrected by w(rite) Disk /dev/sda: 1000.2 GB, 1000204886016 bytes 255 heads, 63 sectors/track, 121601 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0xd55caae2 Device Boot Start End Blocks Id System /dev/sda1 1 5 40131 de Dell Utility /dev/sda2 * 6 1926 15427584 7 HPFS/NTFS /dev/sda3 1926 14980 104857600 7 HPFS/NTFS /dev/sda4 14980 243202 1833193472 f W95 Ext'd (LBA) Disk /dev/sdb: 1000.2 GB, 1000204886016 bytes 255 heads, 63 sectors/track, 121601 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x0a0b0000 Disk /dev/sdb doesn't contain a valid partition table Disk /dev/md126: 2000.4 GB, 2000405135360 bytes 255 heads, 63 sectors/track, 243202 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 131072 bytes / 262144 bytes Disk identifier: 0xd55caae2 Device Boot Start End Blocks Id System /dev/md126p1 1 5 40131 de Dell Utility Partition 1 does not start on physical sector boundary. /dev/md126p2 * 6 1926 15427584 7 HPFS/NTFS /dev/md126p3 1926 14980 104857600 7 HPFS/NTFS /dev/md126p4 14980 243202 1833193472 f W95 Ext'd (LBA) /dev/md126p5 14981 45821 247721984 7 HPFS/NTFS /dev/md126p6 45821 211547 1331200000 b W95 FAT32 /dev/md126p7 211547 211611 512000 83 Linux /dev/md126p8 211611 243202 253755392 8e Linux LVM Disk /dev/mapper/live-rw: 4294 MB, 4294967296 bytes 255 heads, 63 sectors/track, 522 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disk /dev/mapper/live-rw doesn't contain a valid partition table Disk /dev/mapper/live-osimg-min: 4294 MB, 4294967296 bytes 255 heads, 63 sectors/track, 522 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disk /dev/mapper/live-osimg-min doesn't contain a valid partition table 以下省略

  • Tcl/Tkのエラーメッセージ対応

    Tcl/TkでGIF形式指定のうえ画像保存をしようとすると、次のようなエラーメッセージが出ます。  "Too many colors …" これはパレットにない色を使用した結果だと思うのですが、image createコマンドでオプションを次のように指定しています。  image create …… -format gif -palette 256/256/256 なお使用した色は次の6色で、エラーメッセージが画像保存の段階になって出てくるので、どの色でひっかかっているのか不明です。  blue,DeepSkyBlue,red,coral,black,white 一つ一つの色を取捨選択して確認するのも面倒なことだし、後学のためにご存知の方がいらっしゃればコメントお願いします。 Tcl/Tkが扱うGIFカラーは、特定の256色に固定なのか、それとも1670万色のうちの任意の256色を指定できるのかも知りたいところです。具体的に説明しているURLの紹介でもかまいません。なおTcl/TkのバージョンはWindows版"ActiveTcl8.4.7.0"です。

  • 画像の四隅を丸くしたい

    html初心者です。 あるメイン画像の左上に、透過gif画像を重ねて表示させたいのですが、そのようなことは可能なんでしょうか・・・ メイン画像は長方形です(通常の画像のように、ふちは角ばっている)。その画像の左上に、透過gif画像を重ねて表示させようとしています。 htmlには: <TABLE>  <TR>   <TD>    <div id="corner"><IMG SRC="images/frame4_03.gif"></div>    <div id="inner"><IMG SRC="screen05_04.jpg"></div>   </TD>  </TR> </TABLE> cssには: #corner{ position:absolute; left:251px; top:98px; width:99px; height:39px; BACKGROUND-COLOR:#FFFFFF; } #inner{ position:absolute; left:251px top:98px; width:999px; height:799px; } と書いています。 WindowsXP、IE7で表示させています。 よろしくおねがいいたします。

    • ベストアンサー
    • HTML
  • フォトショップで背景だけ透明にしたい

    ヘルプを読んでも、専門用語のオンパレードで全然わかりませんでした。 以下ヘルプ抜粋 ―――――――――――――――――――― 背景を透明にしてインデックスカラー画像をGIFに出力するには: 1 表示する画像部分を選択します。 2 チャンネルパレットの下部にある「選択範囲を保存」ボタンをクリックし、選択範囲に基づいてアルファチャンネルを作成します。パレットのチャンネル名を書き留めておきます。 3 ファイル/出力用プラグ/GIF89a出力を選択します。 4 「透明度」で、作成したアルファチャンネルを選択します。 ―――――――――――――――――――― チャンネルパレットでアイコンが下に4つ出てきて→左から2番目の「選択範囲をチャンネル保存」までは何とか進んだのですが。 アルファチャンネル作成?チャンネル名?~以下3、4、全く操作不能状態でした。アイコンで操作するのでしょうか。右クリックのショートメニュで操作するのでしょうか。それとも上のバーからメニューを出してコマンドするのでしょうか? お手数ですが、詳しくご教授お願いします。

専門家に質問してみよう