• 締切済み

FORTRAN でBMP画像の値の取得

FORTRAN でBMP画像の値の取得をしたいのですが,どうすればいいでしょう? たとえば,10×10画素の8bitのbmp画像の各ピクセルの値を読んで,テキストに書き出したいとします. ですので,できるファイルは・・ 1,1,255 1,2,255 ・ ・ ・ みたいに,X座標,Y座標,そこの値 っていうふうにしたいんです. わからないのは,BMP画像の値の取得方法です. また,bmpを読み込んで,その情報を元にまたbmpを作る時はどうすればいいでしょう? 長々とすいません.

  • kubb
  • お礼率25% (3/12)

みんなの回答

noname#35109
noname#35109
回答No.2

以下,FORTRAN とは無関係? な話です。 例えば, 白白白白白白白白白白 白白白白白白白白白白 白白白白白白白白白白 白白白白白白白白白白 白白白白白白白白白白 白白白白白白白白白白 白白白白白白白白白白 白白白白白白白白白白 白白白白白白白白白白 白白白白白白白白白白 という 10×10 の8bitBMPをフォトショップで作り保存し, 16ビットバイナリエディタで開いてみました。 データは以下のようでした。 42 4D F0 00 00 00 00 00 00 00 76 00 00 00 28 00 00 00 0A 00 00 00 0A 00 00 00 01 00 08 00 00 00 00 00 7A 00 00 00 12 0B 00 00 12 0B 00 00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 80 00 00 80 00 00 00 80 80 00 80 00 00 00 80 00 80 00 80 80 00 00 80 80 80 00 C0 C0 C0 00 00 00 FF 00 00 FF 00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF 00 00 FF FF FF 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 00 00 ↑これはWindowsフォーマット用の8bitBMPファイルです。 こんな感じの画像をいくつか作り,バイナリエディタで開くと以下のようにわかります。 ---ヘッダ部--- 42 4D F0 00 00 00 00 00 00 00 76 00 00 00 28 00 00 00 0A 00 00 00 0A 00 00 00 01 00 08 00 00 00 00 00 7A 00 00 00 12 0B 00 00 12 0B 00 00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 80 00 00 80 00 00 00 80 80 00 80 00 00 00 80 00 80 00 80 80 00 00 80 80 80 00 C0 C0 C0 00 00 00 FF 00 00 FF 00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF 00 00 FF FF FF 00 ---データ部--- 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 ---フッタ部--- 00 00 OS/2 用にBMPを保存すると,ヘッダ部分が変わるだけで,データ部とフッタは変わらないようでした。 次に, 黒白白白白白白白白白 白白白白白白白白白白 白白白白白白白白白白 白白白白白白白白白白 白白白白白白白白白白 白白白白白白白白白白 白白白白白白白白白白 白白白白白白白白白白 白白白白白白白白白白 白白白白白白白白白白 というBMPを作り,バイナリエディタで開くと, 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 ←この行の1が 00。 00 00 次に, 黒黒白白白白白白白白 白白白白白白白白白白 白白白白白白白白白白 白白白白白白白白白白 白白白白白白白白白白 白白白白白白白白白白 白白白白白白白白白白 白白白白白白白白白白 白白白白白白白白白白 白白白白白白白白白白 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 00 00 0F 0F 0F 0F 0F 0F 0F 0F 00 00 ←1と2が 00。 00 00 次に, 黒黒白白白白白白白白 黒白白白白白白白白白 白白白白白白白白白白 白白白白白白白白白白 白白白白白白白白白白 白白白白白白白白白白 白白白白白白白白白白 白白白白白白白白白白 白白白白白白白白白白 白白白白白白白白白白 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 00 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 00 ←1が 00。 00 00 0F 0F 0F 0F 0F 0F 0F 0F 00 00 ←1と2が 00。 00 00 と言う風なことがわかります。 >> X座標,Y座標,そこの値 っていうふうにしたいんです. FORTRANの方法はわかりませんが, データを後から読んでいって, フッタと改行を削除すれば,X座標Y座標はわかります。 なぜか上下がひっくり返っているようです。 >> その情報を元にまたbmpを作る時はどうすればいいでしょう? これまたFORTRANの方法はわかりませんが, バイナリエディタで保存すれば,BMPが保存されます。 全然参考にならない回答かもしれませんが,解析結果です。 バイナリエディタには「Stirling(スターリング)」↓を使わせていただきました。

参考URL:
http://www.vector.co.jp/soft/win95/util/se079072.html
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

OSは何? なんでFORTRANでやるの? 端的に言ってFORTRANでやる作業に思えないし、ビットマップ画像のフォーマットも色々と合ったと思うので、そもそも環境が分からないと適切な回答もできないと思いますけど。

関連するQ&A

  • C++ Builderにおける画像データの取得について

    C++での画像処理プログラムの研究をしている者です。 文字数制限がありますので簡潔になりますがよろしくお願いします。 担当教官から基本となるプログラムをいただいたのですが実行するとエラーが出てしまいます。 プログラム内容: void TImg::ImgMemToBmp(Graphics::TBitmap *bmp, BYTE *img) { GetBmpHdr(); // ビットマップヘッダー取得 String fileName = StartDir + "\\tmp.bmp"; FILE *fp;if (NULL == (fp = fopen(fileName.c_str(), "wb"))) return; fwrite(BmpHeader, 54, 1, fp); // ヘッダー //******** 画像書き込み ******** BYTE *p, *img1 = (BYTE *)malloc(Pixel_X_Max*3); for (int y=0; y<Pixel_Y_Max; y++) { p = img + (Pixel_Y_Max-y-1) * Pixel_X_Max; for (int x=0; x<Pixel_X_Max; x++) { *(img1+3*x) = *(img1+3*x+1) = *(img1+3*x+2) = *(p+x); } fwrite(img1, Pixel_X_Max*3, 1, fp); } fclose(fp); bmp->LoadFromFile(fileName); // BMPファイル読み込み DeleteFile(fileName); free(img1); // 不要ファイル、メモリ削除 } 問題点:下から3行目の bmp->LoadFromFile(fileName); でクラスの例外が発生しました。"ビットマップが不正です"とのエラーが出ます。 私なりにプログラムを解析してみたところ で、tmp.bmpというファイルを作りそこに白黒画素値を書き込んでいるように思うのですが 途中で止めてtmp.bmpのサイズを確認してみたところ 原画像が640×480の画像でtmp.bmpのサイズは20971840×15728640となっていました。 これが原因でエラーと出たのではないかと考えたのですがいかがでしょうか? 補足要求していただければ、適宜補足いたしますので どうかご助力をよろしくお願いいたします。

  • 画像のRGBの値

    画像フィルタが必要になり、そのために画像の性質を知るために、画像のRGBの値を直接求めようと思いました。 具体的には、画像ファイル(BMP)があり、その画像の全画素のRGBの値をテキストファイル(CSV形式)に変換したいのです。そのようなツールありますか? 特殊な用途なので、 while(getpixel(r,g,b)) { printf("%d,%d,%d\n",*r,*g,*b); } のようなプログラムを書かないといけないと思うのですが、「BMPファイルの先頭から順番に画素のRGBの値を持ってくる関数getpixel」が書けません。

  • BMP画像の取り扱い

    (1)BMP形式の画像を読み込み (2)RGB値を取得 (3)画素値を操作 (4)新しいファイルに書き出す というプログラムを作りたいのですが、BMP画像からRGB値がうまく取り出せません。 参考URLなどありましたらぜひ教えてください。

  • 35万画素CCDからのピクセルデータ取得

     35万画素(500x700)CCDからピクセルデータを.bitファイルで取得しています。が、作った解析ソフトがテキスト形式かエクセルからしか読みません。bitをtxtに変換すると書式が変更されて表示がおかしくなります。  エクセルでは6万個しか読まないので画像が切れます。 これを縦横セルがずれることのないように、テキスト化できる方法がありましたら教えてください。

  • fortran g95を使ってBMPを処理したい

    以前XP環境でVisual Fortran(VF)を使ってBMPファイルを読み込むプログラム使っていました. PCがWin7になった為,FreeのFortran g95を使用して同様の処理を行いたいのですが,上手くできません.例えば”test.bmp”と言う8bitのファイルを読み込みたいとしたとき, VFでは character*1078 temp integer*1 data open(10,file='test.bmp',form='binary') read(10)temp read(10)data このときwrite(*,*)dataは133とします. g95では"binary"が使用できず, character*1078 temp chracter*1 data open(10,file='test.bmp',form='formatted') read(10,*)temp read(10,*)data data2=ichar(data) write(*,*)data2は32となってしまいます. 画像の輝度は133で,VFで読み込んだ値となります. 上のプログラムで何を直せば g95でも正しい輝度情報を読めるのでしょうか? どうぞ宜しくお願いします.

  • FortranでJPEG画像を

    FortranでJPEG画像を扱うことは可能でしょうか? 作成したいプログラム内容は以下の通りです。 JPEG画像をグレースケールに変換して、その画像の各ピクセルの階調値を テキストファイルに書き込む。 今は、JPEG画像を一度Photoshopでrawにしてから扱ってます。 ご教示ください。

  • Fortranで出力したファイルの内容を並べ替えたいです

    いま、Fortranをつかって統計物理の解析を行っています。計算結果は --- 時刻T1 AのX座標 AのY座標 AのZ座標 BのX座標 ・・・ 時刻T2 AのX座標 AのY座標 AのZ座標 BのX座標 ・・・ ・ ・ ・ --- という具合に出力されるのですが、この形式では都合が悪いことがあって --- A T1 X Y Z T2 X Y Z ・ ・ ・ B T1 X Y Z T2 X Y Z ・ ・ ・ C --- と言う感じに出力したいのですが、それぞれの物体が独立して運動するわけではないので、どうしても上の形式で一度出力してからほしい形式に変換しなればなりません。私はFortranしか使ったことがないのでできればFortranで並び替えを行いたいのですが、このようなことがFortranでできますか?また、Fortranでこのような並び替えをするにはどうすれば良いのでしょうか。御教授よろしくお願いします。

  • BMP画像を画像処理して連続に表示したいですが?

    プログラミングの初心者ですが、現在VC++2005のフォームアプリケーションでプログラムについて勉強しています。画像を連続表示するところで、わからなくなってしまったので、みなさんのご指導お願いいたします。 やりたい処理は、取り込んだ画像の色を変化させて、順番に表示したい 処理です。作成したプログラムは下記のようになります。 前略 for(n=0; n<256; n+=20){ for(y=0; y<480; y++){ for(x=0; y<640; x++){ bmp->Setpixel(x, y, Color::FromArgb(n, n, n)); } } pictureBox->Image = bmp; Thread::Sleep(2000); } nの値をbmpに入れてから一回表示し、さらにnを足してからbmpに入れて表示するといった流れですが、Sleepを入れても何にも表示されません。 どういったところは不具合なのかをよくわかりません。 ご指導をいただければ感謝致します。どうぞよろしくお願い致します。

  • bmpファイルの解析

    Cプログラムでbmpファイルを読み込み 最大輝度(仮にbrightnessとします)とその座標(仮にx,yとします)を吐き出させるプログラムを作りたいのですが、うまくいきません。 アドバイスしていただければ助かります。 宜しくお願いします。 以下に作成したソースを載せています。 #include<stdlib.h> #include<stdio.h> #include<string.h>/*strcat関数で必要*/ unsigned char brightness; int x_size,y_size,/*imageの横画像数、縦画素数*/ x,y,/*ループ変数*/ max_brightness=0,/*最大輝度*/ max_x,/*最大輝度時のx座標*/ max_y;/*最大輝度時のy座標*/ int main(int argc,char* argv[]) { FILE *fp; char buffer[60000]; char file_name[256]; printf("ファイル名入力="); gets(file_name); strcat(file_name,".bmp"); fp = fopen(file_name, "r"); for(y=0; y<y_size; y++){ for(x=0; x<x_size; x++){ brightness=getc(fp); if(brightness>max_brightness) max_brightness=brightness; max_y=y; max_x=x; } } printf("最大輝度=%d\n",max_brightness); printf("(x,y)=(%d,%d)\n",max_x,max_y); if ( ! fp ) { printf("ファイルが開けません\n"); return 1; } fclose(fp); return 0; }

  • fortranのプログラム

    fortranのプログラム 現在、fortranの勉強をしております。 そこで、質問があるのですが、 ある関数f(x,y,z)の座標(x,y,z)の値がデータとして与えられているとき、 S=10+f をfortranで計算したいと考えております。 ただ、関数fは複数(f1、f2、f3)あり、次々とfに代入してSを計算したいのですが、どのようにプログラムしたらいいか思いつきません。 どなたか、ヒントだけでもいいので、教えてください。 ちなみに、私が考えたプログラムは(下のプログラムはポイントだけ書いてあります。endやその他関係ないと思われるところは省いております。) do 100 k=1,3 S=S+fk(x,y,z) continue function f1 f1(s,t,u)=・・・ return end f2(s,t,u)=・・・ return end 使用しているバージョンは、fortran77(本当は90を使っているのですが、77だけで書いています)です。

専門家に質問してみよう