アルバイトの人に頼む仕事の例 その1

以下のようなソフトを頼むと価格と納期はどれくらいになるでしょうか? なお、著作者の人格権を主張せずソースごと納入するものとします。
言語の優先順位は、java、C++、C、VBの順です。
java版であれば、僕のサーバー上で動かしてURLを指定することで、評価を返すサービスにします。
それ以外であれば、pag1シリーズのシェアウェアとして配布する予定です。

GIF画像を調査するツール

●GIF画像を読み込んで表示します。
・・さらに、ファイルネームとファイルサイズ、パレット数の文字データを表示します。
・・さらに、パレットのイメージデータを表示します。
・・・この部分までは、どの言語でもサンプルプログラムに存在するはずです。java以外では、GIFが扱えないので、OCXを呼ぶことになるかと思います。

●パレット画像の実際の色数を数えるルーチン
パレットにはあるものの、xy座標上に存在しない無駄なパレットの数を調べます。
この関数は、ImageKnifeにもありました。色数が最大で256と限られているのでこちらの方がお手軽です。
・・最大で256個のフラグの配列を用意して、
・・すべてのピクセルについて、パレット番号を調べて、使用済みフラグをチェックし
・・最後に使用済みフラグの立っているパレットを数えます。

●パレットの精度をRGB毎に調べます。
基本的には、徐々に、パレットの下位ビットを切り捨てて行きパレットの下位ビットをマスクすると同じ色になるパレットが生じた段階で、それより高い精度があると判断します。
切り捨て始める前の段階で、すでにパレット番号が異なって同じ色がある可能性もあります。その情報はユーザーにとっても意味があるので、重複したパレットの数として表示します。

・より詳細なレベルで書きます。複数のアルゴリズムが考えられますが、今回はパレットの256*3byteのデータだけに基づいて処理するので、どんなアルゴリズムでもかかる時間は大差ありません。ハッシュは使わず、単語の出現頻度のリストを作る時の様な、テキスト処理で良くやる方法で良いと思います。
・・3バイト単位の比較関数を用意します。
・・・関数内は1行です。
・・256個の3バイトデータを整列します。
・・・Cなどであれば、qsortのルーチンを呼ぶだけです。
・・ソートされたデータを順に辿りながら、隣接するデータを比較することで、重複を数えます。
・・データの下位ビットをマスクして、上記の手順を繰り返します。
・・マスクすることによって、重複数が増えれば、そのビット以上まで有効な精度のヒストグラムに基づくパレットだったと判断し表示します。

●pag1tetoのパレットと並び順を比較します。
・・GIF画像をいったん、24bitに変換します。
・・色数と、パレットの精度を元に、pag1tetoの減色オプションを推定します。
・・pag1tetoのDLLルーチンを呼びます。
・・元のGIF画像と、pag1tetoで減色した画像のパレットの並びを比較します。
減色オプションの推定が正しくてもシステムパレットの差が影響するので、並びには、4色くらいの差が生じます。ですから、同じ場所の色を比較するだけでは失敗します。
しかし、DNAの並びを調べるみたいな手間のかかることまでする必要はありません。
そこで、比較する方法としては、pag1tetoでのパレット番号に相当するパレットが元の画像で何番かを調べて、内積を求めるくらいの処理で済ませます。
あるいは、同じ色の次の色が、同じ色であるかどうかを調べて、何%一致するかを表示します。(こちらの方が良いでしょう。)

 (C)MATSUOKA , Hajime

[HOME][計画]