別のブログで公開してたものです。
一部をこっちのブログに移行しようと手動で(^^;)移行したものです。

Javaで解像度(dpi)を設定してJPEG保存する方法を調べてみた。

次のようにするとできる。

public static boolean saveJpeg(FileOutputStream outputStream, BufferedImage img, float compression, int dpi) {
	if(compression < 0 || compression > 1f) {
		return false;
	}
	ImageWriter iw = ImageIO.getImageWritersByFormatName("jpeg").next();
	try (ImageOutputStream ios = ImageIO.createImageOutputStream(outputStream)) {
		iw.setOutput(ios);

		JPEGImageWriteParam param = (JPEGImageWriteParam)iw.getDefaultWriteParam();
		param.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
		param.setCompressionQuality(compression);

		IIOMetadata imageMeta = iw.getDefaultImageMetadata(new ImageTypeSpecifier(img), param);
		Element tree = (Element) imageMeta.getAsTree("javax_imageio_jpeg_image_1.0");
		Element jfif = (Element) tree.getElementsByTagName("app0JFIF").item(0);
		jfif.setAttribute("resUnits", "1");     // 解像度の単位をDPIにする。
		jfif.setAttribute("Xdensity", Integer.toString(dpi));   // 解像度設定
		jfif.setAttribute("Ydensity", Integer.toString(dpi));
		// メタデータを設定
		imageMeta.setFromTree("javax_imageio_jpeg_image_1.0", tree);

		// 書き込み
		iw.write(null, new IIOImage(img, null, imageMeta), param);
	} catch (IOException ex) {
		return false;
	}
	iw.dispose();
	
	return true;
}