• ベストアンサー

RGB値を画像(PNG・BMPJPEGなど)に出力したい

配列に格納したRGB値からPNG画像(またはBMP画像JPEG画像)を作成したいと思っているのですが、画像ファイルの作り方がわかりません。 ファイルを作成⇒ヘッダ書きこみ⇒色情報書き込み と、漠然とした手順しかわかりません。 詳しい方法、または参考URLがわかる方、アドバイスお願いします。 以下補足です。 ・開発環境はwindowsXPのVC7でC言語を使っています。 ・openCVで適切な関数があれば助かります。 (openCVのIplImageの読み込みなども参考にしようと思いましたがxmlファイルからの取得とは違うのでわかりませんでした。)

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

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

 こんばんは。  openCVの、 ・cvCreateImage関数で24bitのIPLを作成 ・RGB配列をIPLのイメージ配列に転送 ・cvSaveImage関数でファイル名の拡張子にjpgやpngを付ける  で狙い通りにセーブ出来るのではないでしょうか。以下参考程度に。 #include<cv.h> #include<highgui.h> #pragma comment(lib, "cv.lib") #pragma comment(lib, "cxcore.lib") #pragma comment(lib, "highgui.lib") typedef unsigned char Byte; const int WIDTH = 320; const int HEIGHT= 240; const int IMGSIZE = 320 * 240; int main() { //rgbの配列 Byte R[IMGSIZE] = {0}; Byte G[IMGSIZE] = {0}; Byte B[IMGSIZE] = {0}; //緑色に塗り潰す ::memset(G, 0xff, IMGSIZE); //24bitのiplを作成 IplImage* ipl = ::cvCreateImage(cvSize(WIDTH, HEIGHT), IPL_DEPTH_8U, 3); //iplのイメージ配列にrgbの配列を転送 for(int y = 0; y < ipl->height; ++y) { for(int x = 0; x < ipl->width; ++x) { const int dpos = (x * ipl->nChannels) + (ipl->widthStep * y); const int spos = x + (WIDTH * y); ipl->imageData[dpos] = B[spos]; ipl->imageData[dpos+1] = G[spos+1]; ipl->imageData[dpos+2] = R[spos+2]; } } //jpgでセーブ ::cvSaveImage("test.jpg", ipl); //pngでセーブ ::cvSaveImage("test.png", ipl); //iplの破棄 ::cvReleaseImage(&ipl); return 0; }

rumya
質問者

お礼

回答ありがとうございますm(_ _)m お礼が遅くなって申し訳ありません。 丁寧にアドバイスいただきありがたいです。 参考にさせていただきプログラムを作成したのですが highgui.hが他のライブラリと競合してしまったようで 実行できませんでした。 現在解決策を検討中です。

関連するQ&A