使用的包的Oracle jdk下的rt.jar,open jdk 下没有该包,使用open jdk的通过项目引入包的方式可以将包导入,但由于jdk环境不同,使用以下代码修改dpi存在报错情况。
代码:
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
public static void handleDpi(File file, int dpi) {
FileOutputStream fileOutputStream = null;
try {
BufferedImage image = ImageIO.read(file);
fileOutputStream = new FileOutputStream(file);
JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(fileOutputStream);
JPEGEncodeParam jpegEncodeParam = jpegEncoder.getDefaultJPEGEncodeParam(image);
jpegEncodeParam.setDensityUnit(JPEGEncodeParam.DENSITY_UNIT_DOTS_INCH);
jpegEncoder.setJPEGEncodeParam(jpegEncodeParam);
jpegEncodeParam.setQuality(1.0f, false);
jpegEncodeParam.setXDensity(dpi);
jpegEncodeParam.setYDensity(dpi);
jpegEncoder.encode(image, jpegEncodeParam);
image.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(fileOutputStream != null)
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
注意,当图片由文件流转成jpg格式时,图片位深度为32时,上面的代码会报错,需先将设置图片位深度,代码:
public static BufferedImage changePNGBackgroudColor2(String sourceImage) {
try {
File input = new File(sourceImage);
BufferedImage image = ImageIO.read(input);
BufferedImage result = new BufferedImage(
image.getWidth(),
image.getHeight(),
BufferedImage.TYPE_INT_RGB);
Graphics2D graphic = result.createGraphics();
graphic.drawImage(image, 0, 0, null, null);
graphic.dispose();
return result;
} catch (IOException e) {
return null;
}
}