トップページ > 過去ログ > 記事閲覧
大きなpngを読み込むとLoadGraphで異常終了する
名前:gyz 日時: 2012/09/04 17:51

DXライブラリバージョン:3.07f 開発環境:Windows7(64bit),Visual C++ Express 大きな画像(具体的には高さ600、横幅最大36000)をLoadGraphし DrawRectGraphで一部を表示するプログラムを作ったのですが LoadGraphの部分でプログラムが異常終了してしまいます 横幅が10000程度なら特に問題なく動くのですが 15000を超えたあたりで異常終了するようになります(でも時々動く、再現性なし) DXライブラリで読み込める画像の大きさに上限ってあるのでしょうか? DXライブラリのバージョンを3.08cにすると大きな画像でも 問題なく動いたのですが そうするとlibpngで画像を作る処理で png_create_write_struct関数がエラーを吐くようになってしまい 仕方なくバージョン3.07fを使用しています ちなみにですが、以前WindowsXPで開発をしていたときは この現象は発生せず、問題なく意図通りに動いてくれていました その時のDXライブラリのバージョンは3.03だったはずです ご回答よろしくお願いします

Page: 1 |

Re: 大きなpngを読み込むとLoadGraphで異常終了する ( No.1 )
名前:いっち 日時:2012/09/04 20:51

LoadGraph の前で SetUseDivGraphFlag を TRUE に設定した場合どのようになりますか? それと、異常終了発生時の Log.txt をご提供下さい。
Re: 大きなpngを読み込むとLoadGraphで異常終了する ( No.2 )
名前:gyz 日時:2012/09/05 13:28

いっちさん 回答ありがとうございます LoadGraphの直前でSetUseDivGraphFlagをTRUEにしてみましたが 同様に異常終了してしまいました Log.txtはこちらになります (SetUseDivGraphFlag未導入時のLogです) https://dl.dropbox.com/u/40752708/Log.txt
Re: 大きなpngを読み込むとLoadGraphで異常終了する ( No.3 )
名前:いっち 日時:2012/09/05 19:16

> LoadGraphの直前でSetUseDivGraphFlagをTRUEにしてみましたが > 同様に異常終了してしまいました ごめんなさい。間違えました。TRUE ではなく FALSE です。 (3.07f ではデフォルトでTRUEでした) > そうするとlibpngで画像を作る処理で > png_create_write_struct関数がエラーを吐くようになってしまい 具体的にはどのような処理なのでしょうか?
Re: 大きなpngを読み込むとLoadGraphで異常終了する ( No.4 )
名前:gyz 日時:2012/09/06 13:26

SetUseDivGraphFlagをFALSEにして試してみましたが これも同じように異常終了してしまいました その時のログがこちらになります https://dl.dropbox.com/u/40752708/Log2.txt png_create_write_struct関数は png書き込みのための、構造体のメモリを確保する関数です 内部でどのような処理が行われているかまではわかりません libpngでの、png書き込み処理に関する詳細は 私が説明するより、こちらをご覧になるのが速いかと思います dencha.ojaru.jp/programs_07/pg_graphic_10a2.html#write_section ログを見ていて気になったのですが ログの1363の部分に 「最大テクスチャサイズ 幅:8192 高さ:8192」 とあるのですが これがDXライブラリが読み込みを想定している画像の最大解像度 ということなのでしょうか? 今まで、それ以上の画像が読み込めていたのは たまたま通っていただけ、という可能性はあるのでしょうか? もしそうだとしたら、私がしたい処理を実現するには 画像をある程度分割する必要性があるということになりますね
Re: 大きなpngを読み込むとLoadGraphで異常終了する ( No.5 )
名前:いっち 日時:2012/09/06 19:13

> png_create_write_struct関数は > png書き込みのための、構造体のメモリを確保する関数です > 内部でどのような処理が行われているかまではわかりません > libpngでの、png書き込み処理に関する詳細は > 私が説明するより、こちらをご覧になるのが速いかと思います DXライブラリの関数の中ではなく、gyzさんオリジナルのコードの部分でエラーが出るようになったということですね? DXライブラリも内部で libpng を利用しているのでその部分のことを仰っているのかと思いました。 とりあえず、私では分かりかねますので、管理人さんや他の方の回答をお待ち下さい。
Re: 大きなpngを読み込むとLoadGraphで異常終了する ( No.6 )
名前:管理人 日時:2012/09/09 08:20

ご報告ありがとうございます ただ、私の環境では高さ600、横幅30000のpng画像を LoadGrpah で読み込んでも特にエラーは発生しませんでした ( 手元のソフトでは 30000 を超える解像度では一般的なフォーマットで保存できませんでした・・・ ) 原因は不明ですが、大きな画像を読み込んだ場合にエラーの原因となりそうな部分を一部変更したバージョンを アップしましたので、よろしければこちらを試してみてください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe (中身を既存のライブラリのファイルに上書きして、『リビルド』をして下さい) > これがDXライブラリが読み込みを想定している画像の最大解像度 > ということなのでしょうか? 2D描画に関しては「いいえ」で、3D描画に関しては「はい」です ログの出力にあるのはハードウェアが対応しているテクスチャサイズの最大解像度というだけで、 DXライブラリではテクスチャを複数枚使うことでテクスチャの最大解像度以上の画像も扱うことが できるようになっています ただ、それは2D描画での話で、3D描画ではログに出力される最大解像度に依存します ちなみに libpng を使用して png のファイル保存を使用しているとのころですが、 DXライブラリにもソフトウエアイメージを png ファイルで保存する機能があります、 もし libpng を直接使用しなければならない理由がありませんでしたら、 DXライブラリの画像保存機能を使用してみてください ソフトイメージに関してはDXライブラリの関数リファレンスで LoadSoftImage と検索してみてください、 ソフトイメージ関係の関数一覧が見れます あた、ソフトイメージを png ファイルで保存する関数は非公開関数となっていて、定義は以下のようになっています // ソフトウエアで扱うイメージをPNG画像ファイルとして保存する // CompressionLevel = 圧縮率、値が大きいほど高圧縮率高負荷、0は無圧縮,0〜9 int SaveSoftImageToPng( char *FilePath, int SIHandle, int CompressionLevel ) ; 第一引数に保存ファイル名、第二引数にソフトイメージハンドル( LoadSoftImage などで取得できるハンドル )、 第三引数は圧縮率( 0 〜 9 )となります
Re: 大きなpngを読み込むとLoadGraphで異常終了する ( No.7 )
名前:gyz 日時:2012/09/13 08:41

管理人様 丁寧な回答ありがとうございます いただいたテスト版DXライブラリでリビルドしてみましたが 同様のエラーが発生してしまいました エラーの種類も ・LoadGraphで異常終了する ・LoadGraphは通ったが、画像の表示が一部欠けていたり、別のファイルの画像が一部表示される ・LoadGraphは通ったが、画面が滅茶苦茶な表示になりフリーズする といった具合で、再現性もありません 時々意図通りに動いたりするのが厄介です これについては、こちらの問題の切り分けがまだできていませんので 申し訳ありませんが、一旦終了とさせていただきたいと思います pngの保存に関してはDXライブラリのソフトイメージを使用することで 意図通りの画像が保存できるようになりました その手順についてなのですが 1.MakePAL8ColorSoftImageで、ソフトイメージを作成する    (容量削減のためパレット形式のpngを使用しています) 2.SetPaletteSoftImageで、ソフトイメージにパレット情報を作成する 3.DrawPixelPalCodeSoftImageで、ソフトイメージに画像情報を書き込む 4.SaveSoftImageToPngで、pngファイルに保存 5.DeleteSoftImageで、ソフトイメージを削除する という流れで問題ないでしょうか?
Re: 大きなpngを読み込むとLoadGraphで異常終了する ( No.8 )
名前:いっち 日時:2012/09/13 20:25

> これについては、こちらの問題の切り分けがまだできていませんので > 申し訳ありませんが、一旦終了とさせていただきたいと思います gyzさんのご都合にもよりますが、とりあえず、事象の再現する実行ファイルやデータ、 ソース等一式を公開して頂く事はできないでしょうか?(私では動作の確認程度ぐらいしか出来ないと思いますが) 公開が無理なようでしたら管理人さん宛てにメールで送付すると良いと思います。
Re: 大きなpngを読み込むとLoadGraphで異常終了する ( No.9 )
名前:管理人 日時:2012/09/15 21:15

pngの保存の流れに関しては書き込まれた手順で問題ありません 大きな画像を LoadGraph で読み込んだ際のエラーについては 私もいっちさんのお書き込みの通りです

Page: 1 |