サムネイル作成

サムネイルを作成するソフトを自前で作りたくなったので、とりあえず以下のように考えて組んでみた。

  • あまりmemoryを食いたくないので、元画像からは1lineずつ読み取っていく。
  • 縮小専用なので、元画像の1lineは縮小後画像中の最高2line分にしか影響を与えない筈。aspect比の変更は無し。(考慮しない)
  • 元画像の各Pixelに対し、縮小後画像のどの位置に来るかを計算で算出し、変換していく。

Pixelを跨る位置に来る場合は、各channel値をPixelを跨る割合で分割すれば良いだろう…。

座標計算処理に手間取りつつ頑張って実装してみたところ、結果として出来上がった縮小後画像を見てみると色深度が落ちたようなガクガクな画像になってしまった。

原因は、縮小後画像の色深度を普通に各色8bitで用意していた為、元画像の各Pixelを変換後に縮小後画像に入れる際にsampling精度を落としてしまったからだった…。アフォだ。。でもだからといって縮小後画像の色深度を浮動小数点にするのもなぁ、と思い、これじゃあ駄目だと思って、画像の縮小algorithmを調査していた所、平均画素法の存在を知った。

http://www.marumo.ne.jp/db2000_c.htm#20

上のページを参考に組んでみたところ、きれいな縮小後画像を作る事が出来た。前もって、縮小後画像の元画像に対する占有位置や占有率情報等をtable化して、あとはひたすらその情報にしたがってloop。画像size等の条件を限定したり工夫すれば、加算とshift演算を主にした固定小数点処理で処理を済ませる事が出来るみたいなのだけれど、能無しなのでdouble floatで演算。その為かちょっと遅いけど最適化は後から考えよう…。

情報量の多い配列から情報量の少ない配列にsamplingし直すので、品質が落ちてしまうのは避けられないけれど、とりあえず平均画素法で出した品質で満足。処理速度も品質考えると充分速いalgorithmだと思う。場合によってはbilinearでも充分なのかもしれないし、それに比べたらずっと元画像の情報を充分反映するだろう…。

http://www.geocities.jp/beruponu/ThumbnailMaker_20050909.zip