アプリ版:「スタンプのみでお礼する」機能のリリースについて

配列に格納したRGB値からPNG画像(またはBMP画像JPEG画像)を作成したいと思っているのですが、画像ファイルの作り方がわかりません。

ファイルを作成⇒ヘッダ書きこみ⇒色情報書き込み
と、漠然とした手順しかわかりません。
詳しい方法、または参考URLがわかる方、アドバイスお願いします。

以下補足です。

・開発環境はwindowsXPのVC7でC言語を使っています。
・openCVで適切な関数があれば助かります。
(openCVのIplImageの読み込みなども参考にしようと思いましたがxmlファイルからの取得とは違うのでわかりませんでした。)

A 回答 (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;
}
    • good
    • 0
この回答へのお礼

回答ありがとうございますm(_ _)m
お礼が遅くなって申し訳ありません。
丁寧にアドバイスいただきありがたいです。

参考にさせていただきプログラムを作成したのですが
highgui.hが他のライブラリと競合してしまったようで
実行できませんでした。

現在解決策を検討中です。

お礼日時:2009/11/09 18:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!