• ベストアンサー

C言語

JaritenCatの回答

  • ベストアンサー
回答No.8

BMPの場合。。。BMPファイルを(windows版の情報ヘッダ,24bitカラー,無圧縮,パレットなし)と固定してしまえば、画像データはファイルの54バイト目から入っていると思います。 ただし、データ順が一般的な走査順と違って、左下からになります。画素データは青緑赤の順に24ビットで、横幅が4バイト境界になるようにダミーデータが入ります(横1024ならダミーなしですね)。 linuxということでちと気になるのは、BMP形式のデータはリトルエンディアンで格納されています。1バイトずつファイルから読んでくれば問題ないですが、マシン(またはOS)によってはビッグエンディアンに変換が必要なです。 (参考)BMPファイルのヘッダ概要 オフセット 内容とサイズ ------------------------------------------------------------------- 0     ファイルタイプ(2バイト) 'BM'固定 2     ファイルサイズ(4バイト) 6     予約(2バイト+2バイト) 常に0 10    ファイル先頭から画像データまでのオフセット(4バイト) ------------------------------------------------------------------- 14    情報ヘッダのサイズ(4バイト) たぶん40 18    画像の幅(ピクセル)(4バイト) 22    画像の高さ(ピクセル)(4バイト) 正負で方向違う 26    プレーン数(2バイト) 常に1 28    1画素あたりのデータサイズ(2バイト) 24のはず 30    圧縮形式(4バイト) 0のはず 34    画像データ部のサイズ(4バイト) 38    横方向解像度(4バイト) 42    縦方向解像度(4バイト) 46    パレット数(4バイト) たぶん0 50    重要パレットインデックスの数(4バイト) ------------------------------------------------------------------- 54    画像データ 本当の開始位置はヘッダを見ること -------------------------------------------------------------------

tadashi1111
質問者

補足

ありがとうございます。上のは構造体の宣言なのでそれを用いてやってみます。一度回答を締めてもう一度質問しますね。

関連するQ&A

  • c言語、パチンコリール

    c言語とDirectXを使用して、パチンコのリールを作っています。 質問なんですが、図柄の画像が0~9まであったとします。 現在、スプライトを使って左上と右下座標のY座標に値を与えて、画面の上から下まで画像を動かしています。 しかし、9まで行ってもまた画面の上から0を出すことができません。 これをループさせたいのですがどうすればよいでしょうか? 説明内容不足を承知していますので、随時補足していきたいと思いますので、よろしくお願い致します。

  • C言語の質問です。

    C言語の質問です。 以前質問した、C言語初心者のものです。 以前回答してくださった方、ありがとうございました! 前回の質問とかぶるんですが、質問は、 正方形の画像を円形にひきのばす(歪ませる)というプログラムがなかなか書けません。 どなたか教えてください! 円形にひきのばしたときに、正方形のどの座標がどにに移動してるのかってのを考えてつくりたいのですが。 画像を添付しました。 この画像の意味は、たとえば、正方形の中にある緑の四角(座標)が円のほうの緑の四角(座標)に移動したと考えたときに、添付画像に書いてある公式をつかって処理していくってことなんですが・・・。 それを同じようにすべての座標で処理していって円形に歪ませた画像をつくりあげたいんです。

  • c言語によるアルゴリズム

    やりたいことは、たくさんの画像をいくつかのグループ(1グループに画像が数十種類)用意し、入力画像とそれらを比較します。そして、最も入力画像に似ている画像があるグループを選び出します。画像自体はx-y座標に点がある程度です。似た画像かどうかは、openCVのcvMatchShapesを使おうかと考えています。 参考 http://opencv.jp/sample/matching.html 画像を呼び出そうと思うと、一つ一つ画像名から呼び出すと思うのですが、大量の画像を呼び出すことを考えると、画像名を全て書いていたのではプログラムが長くなると思います。何かいい方法はないでしょうか。 また、座標値がわかっていますので、数値でグループを特定できる方法があれば、そちらの方法を教えてもらいたいです。 こちらはプログラミング、画像処理ともに初心者です。他にいい方法があれば,それも教えてもらえるとうれしいです。よろしくお願いします。

  • ヒルベルト曲線のプログラムについて(C言語)

    私は今画像の圧縮の勉強でヒルベルト曲線を勉強していますが、その曲線の座標を示すプログラムが書けません。教えて欲しいです。またその復元させるプログラムも教えて欲しいです。

  • c言語にてプログラミング

    四角じゃないいびつな形の画像があります その画像の中心の座標を得るためのプログラミングを作らなければなりません 全ピクセルのx座標をピクセルの数で割ったりして求めなければなりません これをどうやってプログラミングするかわかりません! 教えてください!!

  • C言語のプログラムに関することで質問です。

    C言語のライブラリを利用したプログラムのことで質問なのですが、座標xとyの成分から、ベクトルの角度(t)と大きさ(r)を求めるプログラムを作りました。しかし、このままのプログラムだと、ある場合のときに限り、正しい値が返されなくなるらしいのですが、それはどのような場合で正しい値が返されなくなってしまうのかを教えてください。また、正しい値がでるようにするにはどこをどう直したらよいのでしょうか? 自分でも考えてみたのですが、分からず困っています。分かる方どうかよろしくお願いいたします。 #include <stdio.h> #include <stdlib.h> #include <math.h> #define square(x) ((x) * (x)) //ベクトルの角度θを返す関数 double theta(double x, double y) { return atan(y / x); } //ベクトルの大きさを返す関数 double radius(double x, double y) { return sqrt(square(x) + square(y)); } int main(int argc, char **argv) { double x, y; //x, yは座標 double t, r; //t, rは極座標 if(argc == 3 && (x = atof(argv[1])) && (y = atof(argv[2]))) { t = theta(x, y);  //極座標tを計算 r = radius(x, y); //極座標rを計算   //ベクトルの角度と大きさを表示 printf("t = %f, r = %f\n", t, r); } return 0; }

  • C言語について

    倍精度の浮動小数点で与えられる4点の座標(x1,y1),(x2,y2),(x3,y3),(x4,y4)を入力して、その4点が頂点になる四角形の面積を算出して表示するプログラムをC言語を用いて書くとどういうプログラムをつくればいいのでしょうかm(__)m

  • 座標

    私は今座標から画像の値を読み出す勉強しています。プログラムを用いて座標を出すことはできました。今度はその実行結果ででた座標の値から画像の画素値を取り出すプログラムを書けたいのですが書けません。いろいろ参考書を見たりCマガジンという雑誌を読んだりしましたが理解できなくて投稿しました。

  • Cで回転プログラムの高速化を

    Cで、90枚の画像を、それぞれ0度から90度まで回転させるプログラムを作りました。 回転の処理は重く時間がかかるため、 それぞれの角度の回転後の位置を配列に格納して、 その値を参照して画像を回転させていこうと思ったのですが、 例えば、画像が300*300としたら回転座標を入れる配列は2次元で2つとりますよね? kaitenX[90][300] kaitenY[90][300] これで、例えば元画像を50度回転させる時のx,y座標が10,50の所の回転後の座標は kaitenX[50][10]の値(回転後のx座標の値) と kaitenY[50][50]の値(回転後のY座標の値)を 参照さしてやればいいと思うのですが、 このとき、回転後の画像をtemp[300][300]という回転後の出力用配列に 代入していくとき、 どうやって代入していけばよいでしょうか? まさか、 for(r=0;r<90;r++) //rは角度情報 for(i=0;i<300;i++) for(j=0;j<300;j++) { temp[i][j] = Gengazo[r][kaitenx[r][j]][kaiteny[r][i]] } なんて風には書けませんよね^^;(自分で一応試したけどダメでした) 回転後の座標を格納するまでは出来ると思うのですが、 格納後、どうやってその値を参照させて、格納させていけばいいか わかりません。 教えていただけませんでしょうか? また、もっと高速化できる効率の良い方法があれば教えて下さい。

  • C言語→MATLABへの変換で、困っています。

    学生研究でMATLABを使用しています。 光学測定系で画像を取り込み、それを解析する実験を行っています。 MATLABはプログラム内の値の変更や処理の追加できることから 大変助かっています。 そこで、もともとはC言語でやっていた3種類の処理を 一つのMファイルで行いたいと思い。 只今、C→MATLAB変換するプログラムの書き直しを行っています。 そのうち2種のプログラムは行列の計算がメインだったため何とか Mファイルに書き直すことができたのですが、 最後のひとつが難しい関数らしきものが多く、 MATLABに書き直すことができるプログラムなのかもわからない状態です。 そこで、 ・C→MATLAB変換可能なプログラムか? ・書き直すにあたってどこを部分を直せばよいのか? をアドバイスいただけないでしょうか? ↓MATLAB化したいC言語ファイル http://karispace.web.fc2.com/cmat2.c 一枚のbmp画像から4枚のdatデータを出力するプログラムです。 C言語とMATLABの三ヶ月前に勉強して、使用しており、基礎がわかる程度です。 よろしくお願いします。