概述
图片DPI:图像每英寸长度内的像素点数。( density is dots per inch)
一开始使用jpeg code包编写,代码如下:public static String setImgDpi(MultipartFile file, int xDensity, int yDensity) {
try {
BufferedImage image = ImageIO.read(file.getInputStream());
ByteArrayOutputStream bo = new ByteArrayOutputStream();
JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(bo);
JPEGEncodeParam jpegEncodeParam = jpegEncoder.getDefaultJPEGEncodeParam(image);
jpegEncodeParam.setDensityUnit(JPEGEncodeParam.DENSITY_UNIT_DOTS_INCH);
jpegEncoder.setJPEGEncodeParam(jpegEncodeParam);
jpegEncodeParam.setQuality(0.75f, false);
jpegEncodeParam.setXDensity(xDensity);
jpegEncodeParam.setYDensity(yDensity);
jpegEncoder.encode(image, jpegEncodeParam);
return Base64.getEncoder().encodeToString(bo.toByteArray());
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
本地测试没问题,但是在发布时编译提示错误:package com.sun.image.codec.jpeg does not exist
度娘上解释说:因为版权原因,jdk1.7后将不会自动包含sun.*的类库,也不建议我们直接使用sun下的类库。
基于这个原因,我们可以手动的将需要的rt.jar导入到我们的项目中即可解决问题。
1.手动将rt.jar放到项目的lib下
2.maven项目可参考(注意windows和linux下的路径格式不一样)
maven-compiler-plugin
UTF-8
${java.home}/lib/rt.jar${path.separator}${java.home}/lib/jce.jar
但是既然已经不提倡使用sun,所以我没有采用上述方法解决问题,而是找了新的类(ImageIO)代替此功能的实现。import org.w3c.dom.Element;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.stream.ImageOutputStream;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Iterator;
public class ImageUtils {
/**
* 设置图片DPI
* @param image
* @param dpi
* @return
* @throws IOException
*/
public static byte[] setImgDpi(BufferedImage image, int dpi) throws IOException {
for (Iterator iw = ImageIO.getImageWritersByFormatName("jpeg"); iw.hasNext();) {
ImageWriter writer = iw.next();
ImageWriteParam writeParams = writer.getDefaultWriteParam();
writeParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
//调整图片质量
writeParams.setCompressionQuality(1f);
IIOMetadata data = writer.getDefaultImageMetadata(new ImageTypeSpecifier(image), writeParams);
Element tree = (Element) data.getAsTree("javax_imageio_jpeg_image_1.0");
Element jfif = (Element) tree.getElementsByTagName("app0JFIF").item(0);
//设置图片dpi
jfif.setAttribute("resUnits", "1"); // density is dots per inch
jfif.setAttribute("Xdensity", dpi + "");
jfif.setAttribute("Ydensity", dpi + "");
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageOutputStream stream = null;
try {
stream = ImageIO.createImageOutputStream(out);
writer.setOutput(stream);
writer.write(data, new IIOImage(image, null, null), writeParams);
} finally {
stream.close();
}
return out.toByteArray();
}
return null;
}
}
最后
以上就是勤奋盼望为你收集整理的java jpg dpi_Java 设置图片的DPI(com.sun.image.codec.jpeg does not exist)的全部内容,希望文章能够帮你解决java jpg dpi_Java 设置图片的DPI(com.sun.image.codec.jpeg does not exist)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复