Swing/ComparisonDifferenceImages のバックアップ(No.8)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/ComparisonDifferenceImages へ行く。
- category: swing folder: ComparisonDifferenceImages title: WritableRasterからDataBufferを取得して画像の比較 tags: [BufferedImage, WritableRaster, DataBuffer] author: aterai pubdate: 2014-11-24T00:02:03+09:00 description: 2つの画像からそれぞれピクセル配列を取得して比較を行い、完全に一致するピクセルのアルファ値を下げることで違いを強調表示します。 image:
概要
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] & 0x44_FF_FF_FF;
}
}
// ...
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
になる?