前提・実現したいこと
高さマップのために16bitグレースケールのpngもしくはリトルエンディアンバイトオーダーのRAWを生成したいです。
そのため、簡潔なものがあればLibpng以外のライブラリでも良いのですが、今回はLibpngを使ってpngを生成しようとしています。
元データとしては0-65535に正規化した2000*2000のデータを使用しています。
発生している問題・エラーメッセージ
実行するとpng_write_png()関数で以下のようなエラーが出て動作が停止します。 デバッグで実行するとpng_write_png()関数を通るときに「wtnpdbは読み込まれていません」と出ます。 Debugでデバッグ無しで実行を行うとexeが停止したとのエラーメッセージが表示されますが、VisualStudioでデバッグを 選択すると、「クラッシュプロセスにアタッチできません。このコマンドを実行するための記憶領域がありません」と出ます。
該当のソースコード
C++
1#include"png.h" 2 3#define PictureSize 2000 4#define PictureDepth 16 5 6 int i, x, y; 7 int row_size; 8 int color_type; 9 10 //保存先ファイル 11 FILE *hp; 12 hp = fopen("HeightMap.png", "wb"); 13 14 //設定 15 png_structp png = NULL; 16 png_infop info = NULL; 17 png_bytep row; 18 png_bytepp rows = NULL; 19 png_colorp palette = NULL; 20 color_type = PNG_COLOR_TYPE_GRAY; 21 row_size = sizeof(png_byte) * PictureSize; 22 23 //構造体初期化 24 png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); 25 if (png == NULL) { 26 goto error; 27 } 28 info = png_create_info_struct(png); 29 if (info == NULL) { 30 goto error; 31 } 32 if (setjmp(png_jmpbuf(png))) { 33 goto error; 34 } 35 //画像の設定 36 png_init_io(png, hp); 37 png_set_IHDR(png, info, PictureSize, PictureSize, PictureDepth, 38 color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, 39 PNG_FILTER_TYPE_DEFAULT); 40 41 //メモリ確保 42 rows = (png_bytepp)png_malloc(png, sizeof(png_bytep) * PictureSize); 43 if (rows == NULL) { 44 goto error; 45 } 46 47 memset(rows, 0, sizeof(png_bytep) * PictureSize); 48 for (y = 0; y < PictureSize; y++) { 49 if ((rows[y] = (png_byte*)png_malloc(png, row_size)) == NULL) { 50 goto error; 51 } 52 } 53 54 //グレースケールでpixelの画素値を設定 55 for (y = 0; y < PictureSize; y++) { 56 row = rows[y]; 57 for (x = 0; x < PictureSize; x++) { 58 *row++ = Buffer[y][x];//0-65535に正規化したデータを代入 59 } 60 } 61 png_set_rows(png, info, rows); 62 63 //保存ここでバグる 64 png_write_png(png, info, PNG_TRANSFORM_IDENTITY, NULL); 65 66error: 67 if (rows != NULL) { 68 for (y = 0; y < PictureSize; y++) { 69 png_free(png, rows[y]); 70 } 71 png_free(png, rows); 72 } 73 74 png_destroy_write_struct(&png, &info); 75 fclose(hp);
試したこと
以下のことを試しましたが、エラーは解決しませんでした。
・元データとなる20002000のデータが存在するかの確認
・1010などの小さなサイズでの確認
・「グレースケールでpixelの画素値を設定」の部分で元データを使わずに適当な値を入れて確認
・3番目と合わせてPictureDepthを8に設定して確認
補足情報(FW/ツールのバージョンなど)
VisualStdio 2013 および 2017
LibpngはNugetから取得
→https://github.com/coapp-packages/libpng
参考サイト
https://www.mm2d.net/main/prog/c/image_io-15.html
→mallocのキャストを追加
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/29 11:55 編集