Swing/ComparisonDifferenceImages のバックアップソース(No.1)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- バックアップ を表示
- Swing/ComparisonDifferenceImages へ行く。
--- title: WritableRasterからDataBufferを取得してピクセルの書き込み tags: [BufferedImage, WritableRaster, DataBuffer] author: aterai pubdate: 2014-11-24T00:02:03+09:00 description: 2つの画像からそれぞれピクセル配列を取得して比較を行い、完全に一致するピクセルのアルファ値を下げることで違いを強調表示します。 --- * 概要 [#g9aa5d38] `2`つの画像からそれぞれピクセル配列を取得して比較を行い、完全に一致するピクセルのアルファ値を下げることで違いを強調表示します。 #download(https://lh3.googleusercontent.com/-wz-vsrJ2L3Y/VHHvorDnjaI/AAAAAAAANp0/i3riWECvTsA/s800/ComparisonDifferenceImages.png) * サンプルコード [#re58018d] #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] & 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(); } }} * 解説 [#g6633551] 上記のサンプルでは、以下の手順で同じサイズの画像からそれぞれのピクセル配列を取得し、比較を行っています。 + `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`になる? * 参考リンク [#lf78620d] - [[MemoryImageSourceで配列から画像を生成>Swing/MemoryImageSource]] - [[PixelGrabberで画像を配列として取得し編集、書出し>Swing/PixelGrabber]] * コメント [#q7110120] #comment #comment