24bppのrawファイルをPNGファイルに変換するプログラムをlibpngを使って以下の様に記述するのですが
runtime errorとなり実行時エラーとなってしまいます。
原因は
png_set_IHDR(png_ptr, info_ptr, width, height, // IHDRチャンク情報を設定します
24, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
で24を指定しているところと次のPNG_COLOR_TYPE_RGB,だと掴んでいるつもりなのですが
なぜうまくいかないのか分かりません。depthを指定するので24でいいのではないでしょうか?
どなたかlibpngをつかっての24bpp RawをPNGに変換する手法をご教授ください
int RawToPng(WCHAR *filename,int width,int height)
{
FILE *fpt_Raw;
unsigned char **image; // image[HEIGHT][WIDTH]の形式です
int i, j;
_wfopen_s(&fpt_Raw,filename,L"rb");
if(fpt_Raw==0x00)
{
MessageBox(NULL,L"File Open End",L"Error",MB_OK);
return -1;
}
else
{
#ifdef _DEBUG
MessageBox(NULL,L"File Open Success",L"OK",MB_OK);
WCHAR DebugStr[256];
wsprintf(DebugStr,L"width=%d,height=%d",width,height);
MessageBox(NULL,DebugStr,L"File Error",MB_OK);
#endif
image = (png_bytepp)malloc(height * sizeof(png_bytep)); // 以下3行は2次元配列を確保します
for (j = 0; j < height; j++)
{
image[j] = (png_bytep)malloc(3*width * sizeof(png_byte));
}
//全部読み込む
for(i=0;i<height;i++)
{
fread(&image[i][0],sizeof(unsigned char),3*width,fpt_Raw);
}
FILE *fpt_output;
_wfopen_s(&fpt_output,L"debug.raw",L"wb");
for(i=0;i<height;i++)
{
fwrite(&image[i][0],sizeof(unsigned char),3*width,fpt_output);
}
fclose(fpt_output);
// PNGファイルを作成します
FILE *fp;
png_structp png_ptr;
png_infop info_ptr;
_wfopen_s(&fp,L"RawToPNG.png",L"wb"); // まずファイルを開きます
png_ptr = png_create_write_struct( // png_ptr構造体を確保・初期化します
PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
info_ptr = png_create_info_struct(png_ptr); // info_ptr構造体を確保・初期化します
png_init_io(png_ptr, fp);// libpngにfpを知らせます
png_set_IHDR(png_ptr, info_ptr, width, height, // IHDRチャンク情報を設定します
24, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
png_write_info(png_ptr, info_ptr); // PNGファイルのヘッダを書き込みます
png_write_image(png_ptr, image); // 画像データを書き込みます
png_write_end(png_ptr, info_ptr); // 残りの情報を書き込みます
png_destroy_write_struct(&png_ptr, &info_ptr); // 2つの構造体のメモリを解放します
fclose(fp);
for (j = 0; j < height; j++)
{
free(image[j]);
}// 以下2行は2次元配列を解放します
free(image);
No.1ベストアンサー
- 回答日時:
depthは1チャンネルあたりのビット数です。
1画素あたりのビット数ではありません。
RGBの画像なら、3チャンネルと数えます。
ですから、 R,G,B各8ビットで合計3x8=24ビットなら、depthの指定は8です。
参考URL:http://dencha.ojaru.jp/programs_07/pg_graphic_10 …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- Visual Basic(VBA) Excel vbaについての質問 3 2023/04/18 16:14
- PHP imageフォルダに、画像をリサイズして保存する時のファイル名を変更したい 1 2023/05/30 11:39
- PHP 共通の処理をまとめる方法がわからないのでアドバイスお願いします。 1 2022/12/19 20:20
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- その他(プログラミング・Web制作) pythonで、tkinterとpillowの組み合わせ 2 2022/08/16 17:42
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- PHP $filePath = './user_img/' . $file['name'];? 1 2022/12/10 07:29
- HTML・CSS PCサイズで赤い画像2つと、青い画像2つがそれぞれ横に2つずつ並んでいるのですが、これをスマホサイズ 5 2022/04/11 12:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
拡張子php画像をjpg画像等に変...
-
どの画像がクリックされたかフ...
-
実行ファイル(exe)に画像ファ...
-
VBSの「MsgBox」について
-
GDI+を使ったビット数とDPIの扱い
-
C# Excelファイルへの画像挿入。
-
VBAでJPGサイズ変更
-
携帯電話から画像ファイルをア...
-
pythonのファイル内に 手書き数...
-
ウィンドウサイズを取得して、p...
-
画像が存在しない時の 「×」 表...
-
10進BASICでの画像回転
-
MYSQLから、画像表示するには
-
アップロード画像数でCSSを分け...
-
ビットマップ画像を読み込むプ...
-
pictureboxに表示した画像のフ...
-
onedrive にexcelファイルをア...
-
こちらはただの直列処理ですか?
-
ワードプレス、Contact Form 7...
-
PHPとCSVで簡易データベースな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBSの「MsgBox」について
-
拡張子php画像をjpg画像等に変...
-
透過PNGが透過されない!!
-
アップロード画像数でCSSを分け...
-
imageフォルダに、画像をリサイ...
-
VBAでJPGサイズ変更
-
Illustratorで文字と画像を流し...
-
VBAのコードを教えてください
-
C# Excelファイルへの画像挿入。
-
php,mysqlにて画像パス保存/表...
-
GDI+を使ったビット数とDPIの扱い
-
SQLiteに画像を格納したい
-
ListViewコントロールでサムネ...
-
★PHP?★画像を縦横比を変えずに...
-
ビットマップ画像を読み込むプ...
-
phpで画像がどうしても文字化け...
-
PHPで吐き出した画像にリンクを...
-
phpMyAdminに画像を保存できない
-
OpenGLで描いて画像ファイル出力
-
手作業で埋め込んだ、UserForm1...
おすすめ情報