• ベストアンサー

4階調BMPファイルの構成

こんにちわ。お世話になります。 WINDOWSのBMPファイルで白黒4階調のデーターは許されているのでしょうか? 存在するのであればデーター構成を教えていただけませんでしょうか。 よろしくお願いします。

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

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★はいその通り。 >横幅6ピクセルだとします。 >2byte目の下位4bitは空データとなり、3~4BYTE目はダミー、 >5byte目がその上段のデーターの1~4ピクセルとなるとの >認識で良いでしょうか?  ↑  あっています。 ・以上。

tomason
質問者

お礼

ありがとうございます。 解決しそうです。

その他の回答 (3)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★まずは前回の『参考URL』を読んで下さい。 ・256色以下(4階調も含む)はパレットデータを必ず含めます。  ファイルの構造は  (1)BITMAPFILEHEADER 構造体  (2)BITMAPINFOHEADER 構造体  (3)RGBQUAD 構造体×4色分→今回の『参考URL』を参考  (4)ビットマップデータ  となります。各構造体は前回の『参考URL』と今回の『参考URL』を参考にして下さい。 ・重要なのは上記の(3)にあたる RGBQUAD 構造体を4色分含めることです。  (2)の BITMAPINFOHEADER にある biBitCount メンバに 2 をセットします。  これで4色(4階調)となります。 ・あと(4)のビットマップデータは1バイトで4ピクセル分をパックして記録します。  1バイトのデータは8ビットあるので8ビット÷2ビット=4ピクセル分となる。   1px目 2px目 3px目 4px目  [1][0] [1][0] [1][0] [1][0]  (MSB)          (LSB)  ↑  これが1バイトのピクセル内容です。  [1]、[0]は4階調(4色)の2ビットのビット1、ビット0を表す。  バイトの高いビット数に1ピクセル目のデータが来る点に注意。→これはリトル・エンディアン CPU 時です。 ・お使いの CPU はリトル・エンディアンですか、それともビッグ・エンディアンですか?  これによりビットマップデータの内容が変わります。確認を。→私はリトル・エンディアン CPU のパソコンです。  ちなみに Intel系がリトル・エンディアン、Motorola(68000)系がビッグ・エンディアンになります。  http://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%B3%E3%83%87%E3%82%A3%E3%82%A2%E3%83%B3  を参考に。 ・以上。まずは『参考URL』を良く読んで下さい。

参考URL:
http://www.kumei.ne.jp/c_lang/sdk2/sdk_169.htm
tomason
質問者

補足

早速のご回答ありがとうございます。 横幅6ピクセルだとします。 2byte目の下位4bitは空データとなり、3~4BYTE目はダミー、5byte目がその上段のデーターの1~4ピクセルとなるとの 認識で良いでしょうか?

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★一般的に存在しないはず。 ・でも BMP ファイルの構造上作ることは可能です。  ただし既存のビューワで閲覧できるかは不明です。  ご自分でビューワを作るのであれば 4 色、8色、32色、64色、128色でも作れますけど。  BMP 形式のルールでは 2色、16色、256色、16384色、フルカラーとなっています。  これ以外の色数は既存のビューワでは表示できないので作らない方が良いでしょう。  これを踏まえて4階調BMPファイルを作成したいのならまたアドバイスしますけど。 ・以上。補足要求します。

参考URL:
http://www5d.biglobe.ne.jp/~noocyte/Programming/Windows/BmpFileFormat.html
tomason
質問者

補足

ご回答ありがとうございます。 質問の目的はその有るかもしれないBMPファイルからマイコン用のBMPファイルに置き換えるための変換プログラムを作る必要があるからなのです。 その為にファイル構成(データー部の構成)を知りたいのです。 よろしくご教授お願いします。

回答No.1

http://extension.sophia-it.com/content/.2dp WindowsCEにはあるようです。 CE以外では表示できないでしょう。 データー構成 http://hp.vector.co.jp/authors/VA023539/tips/bitmap/001.htm BITMAPINFO構造体のbiBitCountを2にする。

tomason
質問者

お礼

ありがとうございます。 やはりありませんか。

関連するQ&A

  • BMPファイルの階調付きを変換したい

    スコアメーカーというソフトで、BMPファイルを開いたら、 「この画像は階調付きのため、2値化しきい値で2値画像に変換します。」と出ました。 スコアメーカーで変換したら画像がおかしくなって、画像を認識できません。 画像の質を落とさないで、階調付きの画像を、2値化しきい値で2値画像に変換するにはどうすればいいですか?

  • bmpファイルの明暗について

    **.bmp のファイル(白黒)があります この画像の明暗を 1pixel 単位で数値化したいのです  例えば 真っ白 = 0 真っ黒 = 255 また、そのデータを csv ファイル等に保存したいのですが 可能でしょうか? 宜しくお願いいたします

  • PhotShopで2階調化

    いつもお世話になっています。 PhotShopで、画像を2階調化すると白黒になるのですが、白黒以外ですることはできるのでしょうか。 もしくは黒い部分に別の色を塗りなおすなどということは可能ですか? よろしくおねがいいたします。 PhotShopは7でWindowsです。

  • photoshopのbmp保存について

    photoshop初心者です。 よろしくお願いします。 地図(白黒)をスキャナーでとり、photoshopにて切り抜き、 色が薄かったので、2階調化で調整し、bmpにて保存しました。 しかし、photoshop以外のツールで見ると真っ黒の中に白い点々がある 画像が出てきてしまいました。 どうしてもbmpで画像をつかいたいのです。 どうすれば普通の画像になるのでしょうか? photshop6.0です。

  • BMPファイルを作成し保存

    教えてください。 環境:VB6 sp5 winXP sp2 行いたいこと(アウトプット):BMPファイルを作成して、HDDなどに保存したいです。 入力情報(インプット):VBコード内で配列としてピクセル情報を持っています。1000*1000の画像で、変数ImageData(1000000)の中に256階調でデータが入っています。 配列内のデータを元に1枚の画像(bmp形式)を作成これを保存したいです。 わかるかた、教えてください。 サンプルコードなどの場所などを添付していただければ幸いです。 よろしくお願いします。 質問の意味がわからなければ、お知らせください、追記します。

  • WINDOWSのペイントで作るBMPファイルの構成

    ペイントで作るBMPファイルの内容が詳しく解説しているサイト等ご存知でしたら教えてください。 BMPファイルのフォーマット等の解説はいろいろありますが実際に作ったファイル内容を見てみますと色数では18hでWINDOWS仕様には無い?(OS/2ではフルカラー?)ですとか2×2ピクセル、3×3ピクセル等小さいファイルを作ってみますと余計な00hが存在する様です。 R,G,Bの3byteで1ピクセルが連続するものと思っていますが途中で余計な00hがあります。 このあたりを理解したいと思っております。 よろしくお願いします。

  • bmp file でエラーがでます。

    windows-me からwindows2000へアップグレードしてから、 ビットマップファイルをダブルクリックすると以下のメッセージがでます。「ファイル'c:\xxxx.bmp'(またはその構成ファイル)が見つかりません。パスおよびファイル名が正しいか、必要なライブラリーがすべて利用可能かどうか、確認してください。」 ただし、ファイルそのものは開いてくれて、問題はないのですが、毎回このメッセージがでます。また、開くアプリケーションをMSペイントにしても駄目で、当然アイコンもWINDOWSのLOGのようなマークのままです。 今のところ、bmpのみでjpgやgifでは、このメッセージはでません。どうかよろしくお願いいたします。

  • BMPファイルへの書き込みができない

    このプログラムは、左半分を黒、右半分を白の画像をBMPファイルに出力しようとしています。(出来ていません) プログラムの下に質問書いてます!お願いします! #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct{ char *filename; int x; int y; int width; int height; unsigned char data[80][100]; } BMP_DATA; static void WriteBmp(char *filename, BMP_DATA Image) { unsigned long Bmp_size;/*BMPファイルのサイズ*/ unsigned int Bmp_info_header_size;/*情報ヘッダのサイズ*/ unsigned int Bmp_header_size;/*ヘッダのサイズ*/ long Bmp_width;/*幅*/ long Bmp_height;/*高さ*/ unsigned short Bmp_planes;/*プレーン数*/ unsigned short Bmp_color;/*色 = 1[bit] (黒か白かだけ)*/ long Bmp_image_size;/*画像部分のサイズ*/ long Bmp_xppm;/*水平解像度*/ long Bmp_yppm;/*垂直解像度*/ int i,j; unsigned char Bmp_headbuf[54]; /*ヘッダ*/ unsigned char Bmp_Data[13]; FILE *Out = fopen(filename, "wb"); if(Out==NULL){ fclose(Out); exit(1); } /* ヘッダ情報の準備 */ Bmp_info_header_size = 40; Bmp_header_size = 54; Bmp_planes = 1; Bmp_color = 1; Bmp_image_size = Image.height * Image.width; Bmp_xppm = 0; Bmp_yppm = 0; Bmp_size = Bmp_image_size + Bmp_header_size; Bmp_headbuf[0] = 'B'; Bmp_headbuf[1] = 'M'; memcpy(Bmp_headbuf+2, &Bmp_size, sizeof(Bmp_size)); Bmp_headbuf[6] = 0; Bmp_headbuf[7] = 0; Bmp_headbuf[8] = 0; Bmp_headbuf[9] = 0; memcpy(Bmp_headbuf+10, &Bmp_header_size, sizeof(Bmp_header_size)); Bmp_headbuf[11] = 0; Bmp_headbuf[12] = 0; Bmp_headbuf[13] = 0; memcpy(Bmp_headbuf+14, &Bmp_info_header_size, sizeof(Bmp_info_header_size)); Bmp_headbuf[15] = 0; Bmp_headbuf[16] = 0; Bmp_headbuf[17] = 0; memcpy(Bmp_headbuf+18, &Image.width, sizeof(Bmp_width)); memcpy(Bmp_headbuf+22, &Image.height, sizeof(Bmp_height)); memcpy(Bmp_headbuf+26, &Bmp_planes, sizeof(Bmp_planes)); memcpy(Bmp_headbuf+28, &Bmp_color, sizeof(Bmp_color)); memcpy(Bmp_headbuf+34, &Bmp_image_size, sizeof(Bmp_image_size)); memcpy(Bmp_headbuf+38, &Bmp_xppm, sizeof(Bmp_xppm)); memcpy(Bmp_headbuf+42, &Bmp_yppm, sizeof(Bmp_yppm)); Bmp_headbuf[46] = 0; Bmp_headbuf[47] = 0; Bmp_headbuf[48] = 0; Bmp_headbuf[49] = 0; Bmp_headbuf[50] = 0; Bmp_headbuf[51] = 0; Bmp_headbuf[52] = 0; Bmp_headbuf[53] = 0; /* ヘッダ情報書き出し */ fwrite(Bmp_headbuf, sizeof(unsigned char), Bmp_header_size, Out); /* 画像データ書き出し */ for(i=0;i<13;i++) Bmp_Data[i] = 0; for(i=0; i<Image.height; i++){ for(j=0; j<Image.width; j++){ int index = j/8; if(j%8 == 0){ Bmp_Data[index] = Image.data[i][j ] * 128 + Image.data[i][j+1] * 64 + Image.data[i][j+2] * 32 + Image.data[i][j+3] * 16 + Image.data[i][j+4] * 8 + Image.data[i][j+5] * 4 + Image.data[i][j+6] * 2 + Image.data[i][j+7]; } } Bmp_Data[12] = (Bmp_Data[12] & 0xf0); fwrite(Bmp_Data, sizeof(unsigned char), 20, Out); /* ○ */ } fclose(Out); } int main() { BMP_DATA Image; int line = 0; int i,j; Image.x = 0; Image.y = 0; Image.width = 100; Image.height = 80; if(line == 0){ for(i=0; i<Image.height; i++){ for(j=0; j<Image.width; j++){ Image.data[i][j] = 1; } } } while(1){ /* BMPファイルデータを編集 */ for(j=0; j<Image.width; j++){ if(j < 50){ Image.data[line][j] = 0;//black }else{ Image.data[line][j] = 1;//white } } /* すべての列を編集したら、再描画する */ if(line == 63){ /* BMPファイルに書込む */ WriteBmp("display.bmp", Image); break; } line++; } return 0; } 以下の条件で、BMPファイルへ書き込もうとしています ・色の深さ1(黒か白) ・画像のピクセルサイズ(横100×縦80) fwrite関数で1列ずつ書き込もうとしているのですが、 この関数は1バイトずつしか書き込めないみたいで、100ビット書き込もうと思うと、 最低でも104ビット書き込まなくてはならない状況になります。 まず、この4ビットはどう処理すればいいのでしょうか?? あと、display.bmpのファイルがある状態で、プログラムを実行するとちゃんと動くのですが、 プログラム中の○のところのfwrite関数の第三引数を13にすると、BMPファイルが壊れて閲覧できなくなります。(ある程度大きい数字だと、BMPファイルは壊れないのですが、ぐちゃぐちゃの絵になります) その理由もわかりません。 汚い文章&プログラムですが よろしくお願いします><

  • BMPファイルがペイントで見つかりません

    Windows98SE を使っていますが、BMPファイル(もちろん拡張子.bmp)をエクスプローラ上でダブルクリックしたところ、「D:\△△\○○.bmpが見つかりませんでした。」と、ペイントのメッセージが出ました。 このメッセージって、何がどうなっちゃってるんでしょうか。 BMPファイルのオープンで、関連づけられたペイントが起動されたのに、呼出元のBMPファイル自信が、フルパスでわかっているのに、ペイントに「見つからない」なんて。 ちなみに、ペイントを起動させてから、同じファイルをオープンすると普通に表示できるんです。 また、再起動すると普通に戻るんですけど。 時々こうなるんです。 こんなこと経験した方いらっしゃいませんか。

  • 画像の読み込み&白黒判別プログラム(2階調・2値化)

    ビットマップの画像で太い曲線が書いてあるデータをVBで読み込み,それを白黒2階調にして表示させ,輪郭を抽出し,その曲線の平均のライン(中心のライン)を取得するというプログラムを制作しています。 現在,データ取り込み&白黒化で行き詰っています。 詳しく解説があるサイトやサンプルを紹介していただければ幸いです。 環境 Visual Basic 6.0 Windows 2000