その2フルカラー画像の色数を減らす処理の1つのメディアンカットのJavaのソースプログラムを説明していきます。全ソースの内容は、「減色処理(メディアンカット)」を参照してください。}画像で使われている全てのRGBの値(0~255)を格納するクラスColorCubeを作りました。このクラスはRGBを軸にした三次元配列を扱うもので、任意のRGB値を有(ON)に設定、RGB値の有無(ON/OFF)の判定、指定したRGBの範囲にあるを有(ON)の数をカウントすることができます。}実装は3次元配列を使わずに、int型の1次元配列を使い、色の有無(ON/OFF)はint型のビットに割り当てています。Javaで扱えるデータ型のうち、boolean型(論理値型)が「true」か「false」の2つの値だけを持てるので、色の有無(ON/OFF)を判定するのには最適ですが、今回は使用するデータサイズ(byte)を減らすためにビットを使いました。boolean型のサイズは、実装はJava仮想マシンに依存するとのことなので1ビット、1バイト(8ビット)、4バイト(8ビット)なのかは不明ですが、意図的に有無(ON/OFF)の情報を1ビットで持つことで、使用するデータ量を最小にしています。RGB値の組み合わせ256×256×256をint型のビット数32で割った、524,288がint型の個数になり、この値にint型のバイト数4を掛けた値、524,288x4=2,097,152バイト(約2メガバイト)が使用するデータ量です。下図は、G(緑)とB(青)成分を2048個のint型の配列で表したものです。この塊が、R(赤)成分(0~255の256個)に対応する数だけ必要なので、256×2048=52,488が必要なint型となります。}data_positionメソッドは、RGBの値が格納されているint型配列の位置を返すメソッドです。指定したr,g,bの値のいずれかが、0~255の範囲にいない場合、-1を返しエラーとしています。このプログラムでは範囲外になることはありませんが、エラー処理としてソースに書いています。32は戻り値で、r,g,bからint型配列の添え字を計算しています。32の式のほうがわかりやすいかもしれません。どちらも同じ計算結果になります。}setメソッドは、r,g,bの位置に有(ON)を設定するメソッドです。r,g,bでdata_positionメソッドを実行し、配列の添え字dposを取得します。]には、32個の情報(32ビット)が含まれているので、この中に必要な情報(1ビット)をセットします。1番目がセットするビットです。]の論理和(OR)を計算することで、特定のビットを1(ON)にしています。ここから、B成分=70を有(ON)にする例を説明します。下図の青線で囲まれた位置は、B=64~95の色の情報を持っているint型配列の位置を示しています。この中のB=70に対応するビットを1にします。]の値、2は0x80000000を6回右にビットシフトした値、3は1と2の論理和(OR)を計算した値です。この結果、B成分=70の位置にビット1が設定されたことがわかります。}getメソッドは、r,g,bの位置が有(ON)が無(OFF)かを判定するメソッドです。r,g,bでdata_positionメソッドを実行し、配列の添え字dposを取得します。]には、32個の情報(32ビット)が含まれています。]の論理積(AND)の計算を行い、その値が0でなければ有(ON)と判定し、0なら無(OFF)と判定しています。以下の例は、B成分=70が有(ON)か無(OFF)かを判定する例です。]の値、2は0x80000000を6回右にビットシフトした値、3は1と2の論理積(AND)を計算した値です。この結果、3が0になったのでB成分=70の位置にビットが無いと判定されます。これは、元データのB成分=70のビットが1の場合の結果です。3の結果が0ではないのでB成分=70の位置にビットが有ると判定されます。}pixel_numberメソッドは、rmin~rmax,gmin~gmax,bmin~bmaxの範囲で設定されている色(ビットが1のもの)の数を取得するメソッドです。RGBの範囲のColorCubeを参照するループをつくっています。具体的には、変数rをrmin~rmax、変数gをgmin~gmax、変数bをbmin~bmax1に変化させ、getメソッドがtrueの個数を数えます。ここから先の説明は次回に続きます。