• category: swing folder: ComparisonDifferenceImages title: WritableRasterからDataBufferを取得して画像の比較 tags: [BufferedImage, WritableRaster, DataBuffer] author: aterai pubdate: 2014-11-24T00:02:03+09:00 description: 2つの画像からそれぞれピクセル配列を取得して比較を行い、完全に一致するピクセルのアルファ値を下げることで違いを強調表示します。 image: https://lh3.googleusercontent.com/-wz-vsrJ2L3Y/VHHvorDnjaI/AAAAAAAANp0/i3riWECvTsA/s800/ComparisonDifferenceImages.png

概要

2つの画像からそれぞれピクセル配列を取得して比較を行い、完全に一致するピクセルのアルファ値を下げることで違いを強調表示します。

サンプルコード

int w = iia.getIconWidth();
int h = iia.getIconHeight();
int[] pixelsA = getData(iia, w, h);
int[] pixelsB = getData(iib, w, h);
source = new MemoryImageSource(w, h, pixelsA, 0, w);
for (int i = 0; i < pixelsA.length; i++) {
  if (pixelsA[i] == pixelsB[i]) {
    pixelsA[i] = pixelsA[i] & 0x44ffffff;
  }
}
//...
private static int[] getData(ImageIcon imageIcon, int w, int h) {
  Image img = imageIcon.getImage();
  BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
  Graphics g = image.createGraphics();
  g.drawImage(img, 0, 0, null);
  g.dispose();
  return ((DataBufferInt) (image.getRaster().getDataBuffer())).getData();
}
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、以下の手順で同サイズの画像から、それぞれのピクセル配列を取得して比較を行っています。

  1. ImageIconからImageを取得
  2. BufferedImage.TYPE_INT_RGBで作成したBufferedImageImageをコピー
  3. BufferedImageから、WritableRasterを取得
  4. WritableRasterからDataBufferを取得
  5. DataBufferDataBufferIntにキャストして、DataBufferInt#getData()intのピクセル配列を取得

比較結果は、 MemoryImageSourceに格納し、Component#createImage(ImageProducer)Imageに変換しています。

  • ImageIO.read(...)で取得したBufferedImageから、getRaster().getDataBuffer()DataBufferを取り出すと、DataBufferByteになる?

参考リンク

コメント