java设置png dpi_图片PNG,JPEG DPI 调整
时间: 2024-03-21 16:43:58 浏览: 170
Java 中可以使用 ImageIO 类的 write 方法来写入 PNG 和 JPEG 图片,并且可以设置 DPI。
对于 PNG 图片,可以使用 ImageWriteParam 对象来设置 DPI。代码示例如下:
```java
BufferedImage image = ImageIO.read(new File("input.png"));
ImageWriter writer = ImageIO.getImageWritersByFormatName("png").next();
ImageWriteParam writeParam = writer.getDefaultWriteParam();
IIOMetadata metadata = writer.getDefaultImageMetadata(ImageTypeSpecifier.createFromRenderedImage(image), writeParam);
String metadataFormatName = metadata.getNativeMetadataFormatName();
IIOMetadataNode pngNode = new IIOMetadataNode(metadataFormatName);
IIOMetadataNode pHYsNode = new IIOMetadataNode("pHYs");
int dpi = 300; // 设置 DPI
pHYsNode.setAttribute("pixelsPerUnitXAxis", Integer.toString((int) Math.round(dpi / 0.0254)));
pHYsNode.setAttribute("pixelsPerUnitYAxis", Integer.toString((int) Math.round(dpi / 0.0254)));
pHYsNode.setAttribute("unitSpecifier", "meter");
pngNode.appendChild(pHYsNode);
metadata.mergeTree(metadataFormatName, pngNode);
File output = new File("output.png");
ImageOutputStream stream = ImageIO.createImageOutputStream(output);
writer.setOutput(stream);
writer.write(metadata, new IIOImage(image, null, metadata), writeParam);
stream.close();
writer.dispose();
```
对于 JPEG 图片,可以使用 JPEGImageWriteParam 对象来设置 DPI。代码示例如下:
```java
BufferedImage image = ImageIO.read(new File("input.jpg"));
ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next();
ImageWriteParam writeParam = writer.getDefaultWriteParam();
JPEGImageWriteParam jpegWriteParam = new JPEGImageWriteParam(Locale.getDefault());
int dpi = 300; // 设置 DPI
jpegWriteParam.setDensityUnit(JPEGImageWriteParam.DENSITY_UNIT_DOTS_INCH);
jpegWriteParam.setXDensity(dpi);
jpegWriteParam.setYDensity(dpi);
jpegWriteParam.setQuality(1.0f, false);
writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
writeParam.setCompressionQuality(1.0f);
File output = new File("output.jpg");
ImageOutputStream stream = ImageIO.createImageOutputStream(output);
writer.setOutput(stream);
writer.write(null, new IIOImage(image, null, null), jpegWriteParam);
stream.close();
writer.dispose();
```
需要注意的是,设置 DPI 只是给图片添加了元数据,实际上并没有改变图片的像素大小和分辨率。要改变图片的像素大小和分辨率,需要对图片进行缩放操作。
阅读全文