[C++]zlibを用いたpngの解凍と読み込み
Posted: 2018年7月24日(火) 03:21
こんにちは。後学のためにC++で必要最低限の要素でpngを読み込むことを考えています。
イメージデータの圧縮部をを自作の関数で解凍することはでき、pngを読み込むことができたのですが、やはり速度が遅いのでzlibを用いて解凍をしようと考えています。
そこで質問なのですが、何故かzlibの解凍をする関数を用いてもデータがおかしいとのエラーが出るだけで解凍ができません。自作の関数ではできたので、これはおかしいと思い質問させていただきました。
環境はvisual studio 2015でwindows8.1を用いて作成しています。
イメージデータの圧縮部をを自作の関数で解凍することはでき、pngを読み込むことができたのですが、やはり速度が遅いのでzlibを用いて解凍をしようと考えています。
そこで質問なのですが、何故かzlibの解凍をする関数を用いてもデータがおかしいとのエラーが出るだけで解凍ができません。自作の関数ではできたので、これはおかしいと思い質問させていただきました。
//ここまでチャンクデータの読み込み
//comp_size:圧縮データのサイズ
//comp_img:圧縮データ配列
//出力データ分のメモリの確保
unsigned long output_size = img->h*img->real_w + img->h;
unsigned char *output = new unsigned char[output_size];
//zlibのヘッダとフッタ情報は飛ばして読み込む
switch (uncompress(output, &output_size, &comp_img[2], comp_size - 6)) {
case Z_OK:
std::cout << "復号に成功" << std::endl;
break;
case Z_MEM_ERROR:
std::cout << "メモリが不足" << std::endl;
break;
case Z_BUF_ERROR:
std::cout << "出力バッファの不足" << std::endl;
break;
case Z_DATA_ERROR:
std::cout << "入力バッファがおかしい" << std::endl;
break;
default:
std::cout << "その他" << std::endl;
break;
}
//自作関数では解凍できていた(zlib形式のため内部でサムチェック等をしてdeflateを解凍)
//auto output = zlib::decode(comp_img, comp_size);
//以後イメージデータのフィルタリングを解く処理