opamp_sando's blog

クソザコが割りと適当なことを書くためにある備忘録です。あとたまに普通の日記も書きます

WebPのデコードがうまくいかない

libwebpを使ったWebPのデコードを今日朝からずっと取り組んでるんだけどうまくいかない。

WebPを表示するだけの非常に簡易的なWebPViewerを作ろうと思ってlibwebpに手を出した。libwebpでデコードし、QtのQWidgetに表示するということでやってたんだけど、どの画像で表示しても以下のように色がおかしくなる。
(画像調整などの処理を全くしてないので原寸大で表示してしまいかなり大きな画像になってしまった... ちゃんと読み込み出来るようになったらサイズ調整くらいの機能はつけようと思ってるんだが)

まあ、どう見てもRubyのロゴなんだけど 上みたいに色が明らかにおかしくなる。
画像処理したことないだけあって全く原因がつかめない。ファイル自体はchromeで開いて問題ないの確認してるのでリソースのwebpは悪くないように思える。

デコードの処理はこんな感じ

const uint8_t* data = NULL;
if(!ExUtilReadFile(this->filename.toStdString().c_str(),&data,&size))
    return FAILURE;

if(WebPGetInfo(data,size,&width,&height) == 0)
    return FAILURE;

uint8_t *argb = WebPDecodeARGB(data,size,&width,&height);
img = new QImage(argb,width,height,QImage::Format_ARGB32);

free((void*)data);

ExUtilReadFileはlibwebpのexampleに入ってたexample_utilsから流用したもの。処理には一切改良を加えていない。
第一引数にwebpファイルのPATHを渡すと、そのデータを*dataに返し、大きさもsizeにかえしてくれる。
そして、WebPGetInfoはdataとsizeを渡すと画像のwidthとheightを返してくれる。
で、最後にWebPDecodeARGBを使ってARGB形式に変換。戻り値に配列としてデコード済みデータが返る。
で、QImage *imgで宣言しているimgにそれを読みこませる。FormatはQImage::Format_ARGB32を指定。


後はこれをQWidgetに表示すると上のような結果に...
誰か原因わかる人居ませんかね?
わかる人が居たら良ければ教えて欲しいですorz


追記::
完成してから作ろうと思ったけど、やっぱり先にリポジトリ作りました。
https://bitbucket.org/opampg/webpviewer
基本的にdevブランチで作業してるのでコードはdevブランチを...
あと、表示テストをするために現在/Users/opamp/Desktop/test.webpを読むように作っています。
ここにtest.webpがないとセグメンテーション違反で落ちます。MainWindow.cppの7行目を修正すれば読み込みPATHを変更できます。(もちろん最終的にはドラッグアンドドロップとか「開く」とかで開くようにするけどね)

Firefox ブラウザ無料ダウンロード