• ベストアンサー

C言語

kyrscheの回答

  • kyrsche
  • ベストアンサー率41% (7/17)
回答No.6

またまたアドバイスということで。 #今回は裏付け無しなので、ちょっとあやふや(^_^;; RAW形式は、例えばビデオカードのメモリの状態そのままを ファイルに切り出したと思ってもらえればよいです。 英単語で「未処理の」「生の」という意味があります。 BMP形式は、このRAW形式にBMPヘッダが付いたフォーマットと 思ってもらえればよいです。 Binary Mapped Picture だか、そんな感じの略語です。 どちらも、24bit(32bit)フォーマットであれば、RGBの各レベルが 1ピクセル分格納されます。 (RAWとBMPではRGBの出現順番が違うかもしれません) RGBに分かれないのは、555/655といった1バイトのpacked形式や、 8bitグレースケールの場合、またインデックスカラー(パレットカラー)の場合です。 #呼び名はこれでよかったのか心配・・・(汗 RAW形式は、配列に格納した場合にインデックスがそのまま ラスター位置になりますが、BMP形式は、ラスター位置に更に BMPヘッダ分のオフセットが付きます。 また、RAW形式は左から右、上から下の順でデータを格納しますが、 BMP形式は左から右は同じですが、下から上にデータを格納します。 (WindowsのBMPは確かそうです。unixのBMPは違ったかもしれません) ですので、BMP形式はヘッダのオフセットと上下逆のアクセスが 必要になります。RAW形式だと、この操作がいりません。 ちなみにラスター位置は、ディスプレイの走査順に見た位置で、 左から右、上から下となります。 #ラスター位置だと、画像データと位置情報が同一になるので #処理がしやすく(=分かりやすく)なります。 ですので、画像を扱いたい(プログラムで画像処理をしたい)と いったときに、特に要求が無ければRAW形式の方が 余計な処理(=プログラム)を考えなくても良い利点があります。 その代わり、用意する画像を作るのに特殊な方法が必要になります。 #例えば、JaritenCatさんの例のように 画像処理は、結局は配列のデータをどういじるかですので、 どんな状態で配列に格納しているのかを押さえていると、 どんなデータ形式で格納されていても適切なアクセスができます。 いま、tadashi1111さんがプログラムにかけられる時間(BMP形式)と、 理解・データの準備にかけられる時間(RAW形式)を天秤に掛けて、 傾いた方を選択すると良いと思います。 ちなみに、tadashi1111さんはどんな答えをほしいのでしょう? 今はファイルアクセスのサンプルコードでしょうか?

tadashi1111
質問者

お礼

一度回答をしめてまた新たに質問しますね。

tadashi1111
質問者

補足

BMP方式でやりたいと思います。 C言語の場合、bmpファイルの構造は1画素ごとにRGBがワード単位で多重されているのではなく、1画素ごとに(RGB)の3次元ベクトルを配置する構造をとっているいるようです。よって、たとえば画像imgの(i,j)画素は img[i][j][k]と記述されるようです。ここで、k=1がR、k=2がG、k=3がBの値を表すことになるそうです。と聞きました。 圧縮するまでのBMP方式画像をヒルベルトスキャンし、その座標ごとの画素値を配列にし適当なファイル名をつけディスクに書き出したいんです。圧縮するプログラムはあるのですが><。

関連する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の三ヶ月前に勉強して、使用しており、基礎がわかる程度です。 よろしくお願いします。