---
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
---
* 概要 [#summary]
`2`つの画像からそれぞれピクセル配列を取得して比較を行い、完全に一致するピクセルのアルファ値を下げることで違いを強調表示します。

#download(https://lh3.googleusercontent.com/-wz-vsrJ2L3Y/VHHvorDnjaI/AAAAAAAANp0/i3riWECvTsA/s800/ComparisonDifferenceImages.png)

* サンプルコード [#sourcecode]
#code(link){{
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] & 0x44_FF_FF_FF;
  }
}
// ...
private static int[] getData(ImageIcon imageIcon, int w, int h) {
  Image img = imageIcon.getImage();
private static int[] getData(Image img, int w, int h) {
  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();
  return ((DataBufferInt) image.getRaster().getDataBuffer()).getData();
}
}}

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

+ `ImageIcon`から`Image`を取得
+ 画像ファイルから`ImageIO.read(...)`で`Image`を取得
+ `BufferedImage.TYPE_INT_RGB`で作成した`BufferedImage`に`Image`をコピー
+ `BufferedImage`から`WritableRaster`を取得
+ `WritableRaster`から`DataBuffer`を取得
+ `DataBuffer`を`DataBufferInt`にキャストして`DataBufferInt#getData()`で`int`のピクセル配列を取得

- 比較結果は`MemoryImageSource`に格納し`Component#createImage(ImageProducer)`メソッドで`Image`に変換
- `ImageIO.read(...)`で取得した`BufferedImage`から`getRaster().getDataBuffer()`で`DataBuffer`を取り出すと`DataBufferByte`になる?

* 参考リンク [#reference]
- [[MemoryImageSourceで配列から画像を生成>Swing/MemoryImageSource]]
- [[PixelGrabberで画像を配列として取得し編集、書出し>Swing/PixelGrabber]]
- [https://docs.oracle.com/javase/jp/8/docs/api/java/awt/image/MemoryImageSource.html MemoryImageSource (Java Platform SE 8)]

* コメント [#comment]
#comment
#comment