配列に格納した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;
}
回答ありがとうございますm(_ _)m
お礼が遅くなって申し訳ありません。
丁寧にアドバイスいただきありがたいです。
参考にさせていただきプログラムを作成したのですが
highgui.hが他のライブラリと競合してしまったようで
実行できませんでした。
現在解決策を検討中です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Excel(エクセル) EXCELのグラフを画像(JPG形式)で保存、通常実行がうまく行かない。ステップインはうまく行く 3 2022/08/30 12:06
- PHP $filePath = './user_img/' . $file['name'];? 1 2022/12/10 07:29
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- YouTube ユーチューブへの動画投稿にサムネイルを付ける方法は? 1 2022/07/21 23:45
- その他(開発・運用・管理) フォルダの中にファルダを作成してファイルを格納するバッチコマンド 1 2022/06/30 11:39
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- その他(ソフトウェア) 画像のファイル形式、拡張子が変わると、性能が変わると思うのですが、ファイル名の「jpg、png、do 8 2022/08/10 13:37
- 一眼レフカメラ 「Imaging Edge」を手動起動せず、ARWファイルを最高画質JPEGへ変換する方法は? 2 2022/08/05 11:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 配列の長さの上限
-
defineを使った配列
-
先頭アドレスとは何ですか?
-
テキストファイルから文字列を...
-
【速いブラインドタッチ】手を...
-
配列で格納したものをmsgboxで...
-
C言語 メモリ?
-
C言語で巨大配列を作るにはどう...
-
パイソンの
-
unsigned char配列への入力の仕方
-
配列をEraseしてもメモリが開放...
-
MFC、ダイアログベースでのモー...
-
配列を使わずに、変数名を動的...
-
Redimした動的配列はEraseする...
-
パスカルの三角形
-
【Mathematica】 Protectされて...
-
新型コロナウィルスのオミクロ...
-
ポインタの配列のコンマについて
-
C++ vectorに配列をプッシュしたい
-
C言語で特定列だけを抽出して配...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
配列で格納したものをmsgboxで...
-
配列の参照渡しで型が一致しま...
-
C# Listを使わずに2次元配列の...
-
VBで構造体の配列を関数に渡す...
-
複数の選択範囲の行番号を個別...
-
パイソンの
-
先頭アドレスとは何ですか?
-
【速いブラインドタッチ】手を...
-
C# 配列の変数宣言について。
-
C言語初心者 ポインタについて...
-
unsigned char配列への入力の仕方
-
テキストファイルから文字列を...
-
ExcelVBAで質問です。離れた二...
-
Redimした動的配列はEraseする...
-
C言語で特定列だけを抽出して配...
-
擬似コード 長さがmの配列でな...
-
メモリの初期値
-
C言語初心者 構造体 課題について
おすすめ情報