• ベストアンサー

OpenGLによる描画内容をBMP出力

今、OpenGLで描画した内容をBMP形式で出力しよう思っています。VC6を使用しています。 今のところ、  ・glReadBuffer で読み取るバッファを指定する  ・glReadPixels バッファから情報を読み取る ということぐらいしかわかっていなくて、 このあとどうすればBMPファイルとして出力できるのかがわかりません。 どなたか教えていただけないでしょうか?

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

  • ベストアンサー
  • 03_
  • ベストアンサー率100% (1/1)
回答No.1

BMPのファイルフォーマットにしたがってファイルを書き出せばよいのではないでしょうか。 ファイル構造 → http://www.kk.iij4u.or.jp/~kondo/bmp/ #include <windows.h> #include <stdio.h> #include <malloc.h> /* filname: 出力ファイル名 width: 画像横幅 height: 画像縦幅 bpp: 画像色深度(bits per pixel) この例ではbpp=24専用 */ bool bmp_out(char* filename, int width, int height, int bpp) { unsigned char *buffer; int scanline = ((width * bpp + 31) & ~31) / 8; // 4byte境界 int image_size = scanline * height; buffer = (unsigned char*) malloc(image_size); if(!buffer) return false; glFlush(); glReadPixels(0, 0, width, height, GL_BGR_EXT, GL_UNSIGNED_BYTE, buffer); /* 1 */ BITMAPFILEHEADER bfh; BITMAPINFOHEADER bih; ZeroMemory(&bfh, sizeof(BITMAPFILEHEADER)); bfh.bfType = ((WORD) 'B' | 'M' << 8); bfh.bfSize = sizeof(BITMAPFILEHEADER); bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); /* 2 */ ZeroMemory(&bih, sizeof(BITMAPINFOHEADER)); bih.biSize = sizeof(BITMAPINFOHEADER); bih.biWidth = width; bih.biHeight = height; bih.biPlanes = 1; bih.biBitCount = bpp; FILE *fp = fopen(filename, "w"); if(fp) { fwrite(&bfh, sizeof(BITMAPFILEHEADER), 1, fp); fwrite(&bih, sizeof(BITMAPINFOHEADER), 1, fp); /* 3 */ fwrite(buffer, image_size, 1, fp); fclose(fp); } else { free(buffer); return false; } free(buffer); return true; } /* */の部分はbppの変更により変更する必要のある箇所です。

参考URL:
http://www.kk.iij4u.or.jp/~kondo/bmp/
k314593
質問者

お礼

御回答有難うございました。 なんとか解決できそうです。 助かりました。

関連するQ&A

  • OpenGLでBMP画像を出力するには?

    現在アニメーションの作成にOpenGLを使っています. この動画をきれいに保存したいのでBMP出力を考えています. 画面のキャプチャではなくBMPをプログラムにより 出力する方法を教えてください. よろしくお願いします.

  • OpenGLでの描画のタイミング

     OpenGLの使い方について疑問があったので質問しました.  OpenGLを用いて3Dのゲームを作っています.しかし, どうも処理が遅くカクカクした動きになってしまいます. 描画の量が多くなるにつれて遅くなっているので,原因は 描画の時に原因があるようです.ダブルバッファリング を用いて描画しているのですが,描画のときは… 1「描画関数の実行」(glVertex3f()などの実行) 2「裏に描画」(見えていないバッファに描画) 3「裏表入れ替え」(2つのバッファを交換) 0「一定時間待機して自分自身を呼び出す」            (60FPSなら1/60秒程度) を繰り返すものと考えています.  「1230」と繰り返せば通常通り動くのですが, 「1」に計算がかかりすぎると,「2」と「3」が遅れてしまい, カクカクしてしまうのだろうと考えました. (↑これがそもそも間違っていたらすいません><)  そこで,対策を2つ考えたのですが,これでいいでしょうか? それとも,もっと良い方法はないでしょうか?(「1」を 速くするしか方法はないでしょうか?) 【1】一定時間待機する秒数を可変的にする  現在のところ,「0」では,1/60秒待機させています.  しかし,1に1/30秒かかったとすると,「1230」を 1回繰り返すのに,3/60秒かかってしまうことになり, 結局FPSは20止まりです.  そこで,「123」でかかった時間を記録し,その秒数 を1/60から引いた分だけ「0」で待機すれば,1/60秒になる だろう,という方法です. 【2】描画のタイミングを変える  現在のところ,「1230」の順番で繰り返しています. しかし,これでは描画の関数を呼び出した時,「1」に 1/30秒かかったとすると,実際に表示できるのは1/30秒後 ということになります.よって,プログラムの始めに 「1232」を実行しておき,描画の関数の中身は 「3120」とする,という方法です. (そもそも,「2」と「3」のタイミングを   離せるのかどうかもよくわかりません><)  もちろん【1】と【2】の方法は併用もできると思っています. 「2」はOpenGLに入っているglFlush() 「3」はOpenGLに入っているglutSwapBuffers() 「0」はOpenGLに入っているglutTimerFunc() を用いています. 質問が長くなってしまいましたが,よろしくお願いします. 参考までに… 【OS】Mac OS10.7(Lion) 【開発環境】Xcode3 【言語】c++ 【プログラミング歴】6年(c++2年,OpenGL1年) 【CPU】2.66 GHz Intel Core 2 Duo 【メモリ】4 GB 1067 MHz DDR3

  • メタセコイア+OpenGL+VC++

    開発環境VC++でOpenGLを使ってプログラミングをしているものです。 いまより複雑なモデルを3Dで描きたくて、最近メタセコイアなるものがあることを知りました。 これを使って作成した"***.x"を描画することが「C#とDirectX」の環境下で実現できたのですが、「VC++とOpenGL」の環境下で出力させるにはどうすればよいかわかりません。 ご教授お願いします。

  • OpenGLで描いて画像ファイル出力

    OpenGLで作成したアニメーションを動画ファイルとして保存したいと考えています。 調べると、連続画像を生成して他ソフト(AVI Maker等)で結合する方法があるということなんですが、OpenGLで描いたものを画像ファイル(BMPファイル等)に出力するには、どうしたら良いのでしょうか。 参考になるサイト等ありましたら、お願いします。

  • OpenGLでの連続画像の保存

    OpenGLを使用し、描画した図形がパラパラ漫画のようにアニメーションし、アニメーションするたびに一枚ずつ出力するというプログラムを作成しているのですが、連続で出力すると同じ画像ばかりが出力されてしまいます。 glReadPixel();でバッファを取得し変数に格納した画面表示の情報が更新されていないのが原因と見ていますが、修正の方法がわかりません。知ってる方がいらっしゃったらよろしくお願いします。 Visual stadio2010を使用し、UIにMFCアプリケーションを使用しています。

  • vc++のpictureboxにopenGLの画像を描画する方法につい

    vc++のpictureboxにopenGLの画像を描画する方法について。 現在、Visual C++ 2010のフォームアプリケーションで、任意のパラメータを入力したらその値に応じて物体の動きが変わるといったアプリケーションを開発しています。その動き方をopenGLでアニメーションとして可視化したいと思っています。そして、そのアニメーションをvc++のフォームアプリケーションのpictureboxに表示したいと思っているのですが、vc++とopenGLのどちらもかなりの初心者なので、pictureboxへの表示の仕方がわかりません。 以下に参考URLを貼らせていただきます。このようなものにパラメータを入力する部分を設けたものを作りたいのですが、まったく意味がわかりません。どなたかご教授お願いいたします。 http://www.t-pot.com/program/127_OpenGLNET/index.html

  • 【opengl オブジェクト読込】

    現在VC++でプログラムの開発を行っています。 Shadeや3dsMAXなどで作った3次元オブジェクトをVC++で実行するopenGL上の プログラムに読み込みたいのですがよい方法はあるでしょうか?(opengl+glut) 現在以下を参考にしてvrml形式に変更して読み込んでいるのですが、複雑な形状になると読み込めなくなってしまいます。。。 http://www.komoto.org/opengl/sample12.html ほかによいサンプルや方法などあれば教えてください。 色情報なども保持したまま読み込みたいので、dxf形式ではなくvrmlやobj形式での読み込みを考えています。

  • VC#での24ビットbmp形式での保存方法

    VC#でbmpファイルで保存する場合、以下のようにImageFormat.Bmpとすると思いますが、これだと32ビットbmp形式で出力されます。 24ビットbmpで出力する方法はないでしょうか? if (saveFileDialog1.ShowDialog() == DialogResult.OK) { pb1.Image.Save(saveFileDialog1.FileName,ImageFormat.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は使い始めて数ヶ月なので詳しくないです。 よろしくお願いします。

  • PhotoShopでBMPへ直保存したいのですが

    編集した画像をBMP形式で直保存したいのですが (1)ファイル > 保存(または別名で保存) (2)保存形式をpsdからBMPに変える。 (3)「のコピー」と名前が変化するので消す。 と手間がかかり堪りません。(何十回、何百回と行うもので。) SAIでは「指定のファイル形式で出力 .BMP」というショートカットで 楽に保存できるので近しい機能があるハズだ・・と思うのですが見つけきれず。 手間を省ける方法をご存知の方、方法を教えて頂けますと幸いです。 PhotoShopCS3使用