import org.apache.commons.codec.digest.DigestUtils; import java.awt.image.BufferedImage; import java.awt.image.DataBuffer; import java.awt.image.DataBufferByte; import java.awt.image.DataBufferInt; import java.io.File; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.IntBuffer; import javax.imageio.ImageIO; import javax.imageio.ImageReader; import javax.imageio.stream.ImageInputStream; public class JpegReaderTest { public static void main(String[] args) throws IOException { ImageIO.setUseCache(false); System.setProperty("sun.java2d.cmm", "sun.java2d.cmm.kcms.KcmsServiceProvider"); String file1 = "r:\\tmp\\001.jpg"; String file2 = "r:\\tmp\\002.jpg"; // test 1 - single file only, correct image is produced // 002.jpg = 32629496911f9addbc476ec8db564446 // testFile(file2); // test 2 - 002 is loaded after 001, incorrect image is produced // 002.jpg = 83ba95b3d6c5b8c4c063a824666735bd // testFile(file1); // testFile(file2); } private static void testFile(String filePath) throws IOException { File file = new File(filePath); ImageReader reader = ImageIO.getImageReadersByFormatName("JPEG").next(); System.out.println("Using JPEG reader: " + reader.getClass()); try (ImageInputStream iis = ImageIO.createImageInputStream(file)) { reader.setInput(iis); BufferedImage image = reader.read(0); String imageMd5 = getImageMd5(image); System.out.println("File: " + file.getName() + " = " + imageMd5); } finally { reader.dispose(); } } private static String getImageMd5(BufferedImage image) { byte[] data; DataBuffer buffer = image.getRaster().getDataBuffer(); if (buffer instanceof DataBufferInt) { int[] pixels = ((DataBufferInt) buffer).getData(); ByteBuffer byteBuffer = ByteBuffer.allocate(pixels.length * 4); IntBuffer intBuffer = byteBuffer.asIntBuffer(); intBuffer.put(pixels); data = byteBuffer.array(); } else if (buffer instanceof DataBufferByte) { data = ((DataBufferByte) buffer).getData(); } else { throw new IllegalStateException("Unsupported buffer type: " + buffer); } return DigestUtils.md5Hex(data); } }