• 締切済み

bmpファイルから色情報を取り出すプログラム

ビットマップから色情報を取り出すプログラム bmp2hex 色情報からビットマップを作成するプログラム hex2bmp を作れる方、またはソースの場所を知っている方がいましたら 教えてください。引数は 縦の長さ 横の長さでお願いします。

みんなの回答

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

質問文にある情報だけから作れる人はまずいないでしょうね。 まず、この場合の「色情報」とは何でしょうか? bmp2hexという名前から16進数で出力することを考えているのかなということは想像できますが。 bmpファイルの中の特定のピクセルの色情報を取り出したいのか、それとも全てのピクセルの色情報を出力するのかも不明です。前者なら、そのピクセルの座標指定が必要になります。 また、取り出した色情報はどういう形で出力したいのでしょうか? 何かの変数に入れる? 標準出力にテキストで書き出す? 「引数は 縦の長さ 横の長さでお願いします」ともありますが、bmpファイルの名前とかは引数として必要ではないのかという疑問も湧きます。 どんな入力に対してどんな出力が欲しいのか、仕様を具体的に補足してください。 他にも、そのプログラムを動かすOSは何なのかとか、使用する言語はCでもC++でもいいのかとかの情報も必要でしょう。

whisper33
質問者

補足

ご返信ありがとうございます。 補足です。環境はwindows7で、使用言語はC(またはC++)でお願いします。 入力ではビットマップファイルを期待していまして、 例: bmp2hex.exe test.bmp これを実行すると、色情報のすべてをRGBでテキストとして16進数にて羅列 して出力される事を期待しています。 また、逆変換では、16進数のテキストデータと縦横の長さを指定してビット マップに戻すようなソフトを期待しています。 例: hex2bmp.exe test.txt 640 480 →  test_new.bmp

関連するQ&A

  • 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ファイルは壊れないのですが、ぐちゃぐちゃの絵になります) その理由もわかりません。 汚い文章&プログラムですが よろしくお願いします><

  • C言語でBMP(16bit)を扱う方法

    組み込みソフトの作成を行なっており、液晶に画像を表示するソフトを 作りたいと思っております。 16bitのビットマップ画像をC言語のソースにするにはどうすればよいでしょうか? interface2011年5月号の付録(Renesas RX62N)を使用して、3.5インチQVGAのTFT液晶に 画像を表示したいと思っているのですが、自分で用意した16ビットのビットマップ画像を どうすればC言語ソースに落とせるのかがわかりません。 付録のサンプルプログラムでは、pct_data[]={65535,65535,・・・・}; と各ドットを16bitで表現した配列になっているのですが、ビットマップデータからこのような 配列の作成方法を教えて頂けると助かります。 よろしくお願いいたします。

  • フォトショップでbmpが開けない保存できない

    久しぶりにビットマップファイルを使う機会ができましたが フォトショップで開きません。保存もできません。 【環境】 windows7(64bit) フォトショップCS5(アップデート最新) 【状況】 bmpファイルが開けない、保存できるファイル形式にもない。 「要求された操作を完了できません。ドキュメントの種類が適切ではありません」 すべてのbmp、以前にCS2で編集したbmpファイルも開けなくなっています。 windowsのペイントで新規作成したbmp(24bit)も開けない。 フォトショップで新規作成したデータもbmpで保存不可。 カラーモードはRGB、8bit。 インデックスカラーでシステム(windows)でも× レイヤーも使用なし。 他に何か思い当たる原因がありましたら教えてください。 ※手間はかかりますが、とりあえずwindowsペイントと併用して作業はできてます。

  • BMP画像ファイルの読み書き

    Visual StudioのC言語により、ビットマップ形式の画像に対するプログラミングで 簡単な背景差分のプログラムを作成しています。 背景画像と対象画像2枚を読み込み色の差を取り、 差の値が背景の値と近ければ背景とみなし白で塗りつぶし、 物体だけを表示した画像を生成するようなプログラムです。 1枚のみの画像は以下のプログラムで作動しますが、連続した画像(01.bmp 02.bmp ・・・・100.bmp) を読み込み上記の処理をする場合にはどうすればよいのでしょうか? 分かりにくくて申し訳ないですが、よろしくお願いします。 #include "BMPData.h" #include <math.h> int main(){ int a=150; int i,j; int r,g,b; int ir,ig,ib; int diff; BMPStruct bmp_bg; BMPStruct bmp_oj; BMPStruct bmp; RGB rgb_bg; RGB rgb_oj; RGB rgb; RGB rgb_w; rgb.r = 255; rgb.g = 255; rgb.b = 255; rgb_w.r = 0; rgb_w.g = 0; rgb_w.b = 0; readBMP(&bmp_bg, "back.bmp"); //背景画像の読み込み readBMP(&bmp_oj, "01.bmp"); //対象画像の読み込み makeBMP(&bmp,640, 480, rgb); //出力用画像を生成する for(i=0; i<640; i++){ for(j=0; j<480; j++){ getColor(bmp_bg, &rgb_bg,i,j);  //背景画像の色を取得 getColor(bmp_oj, &rgb_oj,i,j);  //対象画像の色を取得 //rgbそれぞれの値の差 r = rgb_bg.r - rgb_oj.r; g = rgb_bg.g - rgb_oj.g; b = rgb_bg.b - rgb_oj.b; //絶対値 ir = abs(r); ig = abs(g); ib = abs(b); //色の差 diff = ir + ig + ib; //背景かどうかの判定 if(diff>a){ putColor(bmp, rgb_w, i, j); //色の差が大きければ出力画像に対象画像の色をそのまま出力 } else{ putColor(bmp, rgb, i, j); //色の差が小さければ白を出力 } } } writeBMP(bmp, "image01.bmp"); }

  • VC++とResEditの使い方 .rcファイルからの画像の読み込み

    Visual C++2008 Express EditionとResEditを使おうとしています。 これまでVCのプロジェクト内のビットマップを直接読み込んでいましたが、ResEditの.rcの中にビットマップとして画像を保存し、 そこから画像を読み込むようにしたいと思っています。 これまでは、LoadGraph("ファイル名.bmp")で読み込んでいた(DXライブラリを使用しています)のですが、 .rcの中にIDB_BITMAP1という名前(リソースの追加でビットマップを選択すると作成される)で保存されているファイルを呼び出すにはどうしたらいいのでしょうか? LoadGraph("IDB_BITMAP1")では読み込めないようです。

  • AccessでBmpファイルの貼り付けについて

    よろしくお願いします。 アクセスの勉強中で課題としてビデオライブラリを作成しています。 その中でビデオのパッケージ(bmp)ファイルを取り込むのですが参考にしているテキストではテーブルのパッケージイメージフィールドを右クリックして参照でビデオのパッケージ画像(bmp)を選択するとそのフィールドに"ビットマップイメージ"と入力されるとあるのですが何度やっても"パッケージ"と入力されますがこれは何が原因なのでしょうか?どこかで設定すればビットマップイメージと表示されるようになるのでしょうか? パッケージと表示されている場合に、フォームで見るとどうも画像がアイコンのように扱われているようです。 原因と対処法をご存知の方がおられましたらご教授お願いします。 またこの取り込んだときに出てくるパッケージとどういうものなのでしょうか?単純にイメージしたのは画像や音声などがひとつにまとめられたもののような感がありますがいまいち良くわかりません。 よろしくお願いいたします。

  • OpenCVで出力を24bitのbmpにするには?

    OpenCVを使って画像処理(ラべリングなど)をしたのですが、出力を24bitのbmp形式の画像で出力させたいです。 ビット深度?(8bitのbmp形式から24bitのbmp形式)を変更させることはできますか? 自分でいろいろ調べたのですが、いまいち分からなくて困っています。 もしわかる方がいらっしゃれば是非教えてください。 OpenCV2.4.6,VisualC++2010を用いています。 入力画像は白黒画像で、24bitのbmp形式の画像です。 ですが、OpenCVで画像処理させると8bitのbmp画像として出力されます。(ラべリングなどの処理をした後の画像) 他のプログラムで24bitのbmp形式で処理させているため8bitのbmp形式の画像を24bitのbmp画像に変更させたいのですが、変更する方法がわかる方がいればぜひ教えてください。 私自身、プログラムは大学の授業レベル、OpenCVは使い始めて数ヶ月なので詳しくないです。 よろしくお願いします。

  • VC++で困ってます・・・。

    VC++で、ビットマットフォーマットをする。課題がでました。 課題は、ピクチャーボックスにbmpファイルを表示して、表示したbmpからボタンを使って、ラベルや、テキストボックスに、そのbmpのバイト数や、画像に関する、情報を表示する課題です。 今は、ピクチャーボックスから画像を出すことはできたんですが、その後にどうやって画像に関する色のバイト数や、情報を表示するかわかりません。 どこを、いじってプログラムを作っていくかもわからない状況です。 初心者なんで、プログラムの例や、ビットマップファイルに使うプログラムとかいろいろ教えてください。

  • BMP → AVI 作成について

    みなさんはじめまして。 今回、AVIファイルを開き、ヘッダー及びBMPデータをバイナリ形式で書き込んでいくプログラムを作成しようと考えています。 AVIを開く時点での、AVIファイルのヘッダーのビット配列がわかりやすい表などで乗っているサイトをご存知の方おりましたら教えていただけないでしょうか。 よろしくお願いします。

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

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