Swing/ComparisonDifferenceImages のバックアップ(No.2)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/ComparisonDifferenceImages へ行く。
- title: WritableRasterからDataBufferを取得して画像の比較 tags: [BufferedImage, WritableRaster, DataBuffer] author: aterai pubdate: 2014-11-24T00:02:03+09:00 description: 2つの画像からそれぞれピクセル配列を取得して比較を行い、完全に一致するピクセルのアルファ値を下げることで違いを強調表示します。
概要
2
つの画像からそれぞれピクセル配列を取得して比較を行い、完全に一致するピクセルのアルファ値を下げることで違いを強調表示します。
Screenshot
Advertisement
サンプルコード
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解説
上記のサンプルでは、以下の手順で同じサイズの画像からそれぞれのピクセル配列を取得し、比較を行っています。
ImageIcon
から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
になる?