■ int[] ImageProcessor.getPixel(int x, int y, int[] iArray)
こいつの挙動を調べてみた。内部のソースは以下のようになっていた。
public int[] getPixel(int x, int y, int[] iArray) { if (iArray==null) iArray = new int[1]; iArray[0] = getPixel(x, y); return iArray; }
単純に考えれば、ImageProcessorのgetPixel(int x, int y, int[] iArray)が実行されれば、iArray[0]に値が返るだけのはずである。
しかし、私が実験した環境では、長さが3の配列が返され、配列のそれぞれの要素にはx,yで指定したピクセルのRGBが入っていた。
これは、ImageProcessorが抽象クラスだから起こっているようだ。
抽象クラスは、継承して子クラスを作らないと利用できない。作成した子クラスのみを利用していれば特に悩むこともないだろう。
当然ながら、抽象クラスであるImageProcessorの中には宣言だけで定義されていない関数があるので、ImageProcessor自体をnewしてオブジェクトをImageProcessorのオブジェクトを作成するこは出来ない。だが、親クラスは子クラスを代入することが出来る。
子クラスを親クラスに代入した場合、子クラスで定義されている関数が優先して利用される。ImageProcessorの子クラスに相当するクラスには、ByteProcessor、ShortProcessor、FloatProcessor、ColorProcessorが存在する。
実は、ImageProcessorクラスのソースを見たらImageProcessor.getPixel(int x, int y, int[] iArray)を見ることになるのだが、この中で利用されているgetPixel(x, y)はImageProcessorで抽象メソッドとして定義されており、ColorProcessor.getPixel(int x, int y)が何か挙動が違うのかとか、Java弄ったのこれが初めてだし、何か俺の知らない機能が働いてるのかとか色々悩んだが、実は単純にColorProcessor.getPixel(int x, int y, int[] iArray)という風に他の子クラスとは別にColorProcessorだけは独自のgetPixel(int x, int y, int[] iArray)定義されていたという落ちであったorz
実際、ColorProcessor.getPixel(int x, int y, int[] iArray)は以下のように定義されていた。
public int[] getPixel(int x, int y, int[] iArray) { if (iArray==null) iArray = new int[3]; int c = getPixel(x, y); iArray[0] = (c&0xff0000)>>16; iArray[1] = (c&0xff00)>>8; iArray[2] = c&0xff; return iArray; }
つまり、int[] ImageProcessor.getPixel(int x, int y, int[] iArray)は、ImageProcessorがカラーなら3個の配列が、白黒なら1個の配列が返ってくると言うことに注意しなければいけないということのようだ。
■ int ImageProcessor.getPixelCount()
画像の総ピクセル数を返す。(width*heightを返す。)
備考: 旧ブログ移植
コメント