java图片处理
- 图片 包括物理长度,像素,dpi。 像素 / dpi = 物理长度(英寸)
- 一般需要打印出来的图片的dpi最少要设置成300dpi,所以有一些时候,我们就要将上传的图片进行修改dpi,然后进行拉伸
- 一下代码包括修改图片格式,设置dpi的代码
@Test
public void reSizePic() throws Exception{
String path = "/Users/wb-mac/Documents/demo/spring-boot-demo/src/main/resources/pic/1gif.gif";
String path2 = "/Users/wb-mac/Documents/demo/spring-boot-demo/src/main/resources/pic/4gif.jpeg";
String path3 = "/Users/wb-mac/Documents/demo/spring-boot-demo/src/main/resources/pic/4gifdpi.jpeg";
File inFile = new File(path);
File outFile = new File(path2);
File outFileDpi = new File(path3);
BufferedImage oriImg = ImageIO.read(inFile);
BufferedImage reSetTypeImg = fileService.changeImgType(oriImg, oriImg.getWidth(), oriImg.getHeight());
ImageIO.write(reSetTypeImg, "jpeg", outFile);
fileService.setImgDpi(outFile, outFileDpi);
}
//将图片绘制到一个新的图片上,新图片的格式根据“ImageIO.write(reSetTypeImg, "jpeg", outFile)”自定
public BufferedImage changeImgType(BufferedImage srcImage, int width, int height) {
Image image = srcImage.getScaledInstance(width, height, BufferedImage.TYPE_INT_RGB);
BufferedImage newImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = newImage.createGraphics();
g2d.drawImage(image, 0, 0, Color.WHITE, null);
return newImage;
}
//设置jpeg格式图片的DPI,增加图片质量
public void setImgDpi(File inFile, File outFile) throws Exception {
String formatName = "jpeg";
ImageReader imgReader = ImageIO.getImageReadersByFormatName(formatName).next();
imgReader.setInput(new FileImageInputStream(inFile), true, false);
IIOMetadata data = imgReader.getImageMetadata(0);
BufferedImage image = ImageIO.read(inFile);
FileOutputStream fos = new FileOutputStream(outFile);
JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(fos);
JPEGEncodeParam jpegEncodeParam = jpegEncoder.getDefaultJPEGEncodeParam(image);
jpegEncodeParam.setDensityUnit(JPEGEncodeParam.DENSITY_UNIT_DOTS_INCH);
jpegEncodeParam.setXDensity(300);
jpegEncodeParam.setYDensity(300);
jpegEncoder.encode(image, jpegEncodeParam);
fos.close();
}
//设置png格式图片的DPI,增加图片的质量
public byte[] setPngDpi(BufferedImage image, int dpi) throws Exception{
for (Iterator<ImageWriter> iw = ImageIO.getImageWritersByFormatName("png"); iw.hasNext();) {
ImageWriter writer = iw.next();
ImageWriteParam writeParam = writer.getDefaultWriteParam();
ImageTypeSpecifier typeSpecifier = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB);
IIOMetadata metadata = writer.getDefaultImageMetadata(typeSpecifier, writeParam);
if (metadata.isReadOnly() || !metadata.isStandardMetadataFormatSupported()) {
continue;
}
ByteArrayOutputStream output = new ByteArrayOutputStream();
ImageOutputStream stream = null;
try {
setDPI(metadata, dpi);
stream = ImageIO.createImageOutputStream(output);
writer.setOutput(stream);
writer.write(metadata, new IIOImage(image, null, metadata), writeParam);
} finally {
try {
stream.close();
} catch (IOException e) {
}
}
return output.toByteArray();
}
return null;
}
private void setDPI(IIOMetadata metadata, int dpi) throws IIOInvalidTreeException {
// for PMG, it's dots per millimeter
double INCH_2_CM = 2.54d;
double dotsPerMilli = 1.0 * dpi / 10 / INCH_2_CM;
IIOMetadataNode horiz = new IIOMetadataNode("HorizontalPixelSize");
horiz.setAttribute("value", Double.toString(dotsPerMilli));
IIOMetadataNode vert = new IIOMetadataNode("VerticalPixelSize");
vert.setAttribute("value", Double.toString(dotsPerMilli));
IIOMetadataNode dim = new IIOMetadataNode("Dimension");
dim.appendChild(horiz);
dim.appendChild(vert);
IIOMetadataNode root = new IIOMetadataNode("javax_imageio_1.0");
root.appendChild(dim);
metadata.mergeTree("javax_imageio_1.0", root);
}
TIFF格式的图片
在java8 及之前版本中,jdk 中的 ImageIO 读取图片内容会失败,解决办法使用 java9 或者使用第三方插件。
<dependency>
<groupId>com.github.lafa.twelvemonkeyspurejava.imageio</groupId>
<artifactId>imageio-tiff</artifactId>
<version>1.0.1</version>
<type>pom</type>
</dependency>
地址:https://haraldk.github.io/TwelveMonkeys/