Java生成图片默认分辨率是72dpi,由于需要打印生成图片,要求图片分辨率至少300dpi,这个问题整了将近一天时间,最终得到解决,感谢网友的分享。在这里记录一下,已备后面使用。以下代码摘抄至https://my.oschina.net/osgit/blog/530283

/**

* 接口设计

*/

public interface ImageDPIProcessor {

/**

* 根据文件后缀扩展名判断是否能进行处理

*

* @param fileName

* @return

*/

public boolean canHandle(String fileName);

/**

*

* @param path

* @param dpi

* dot per inch

* @return

* @throws IOException

* @throws MalformedURLException

*/

public byte[] process(final BufferedImage srcimage, final int dpi) throws Exception;

PNG处理方式:

public class PngDPIProcessor implements ImageDPIProcessor {

//1英寸是2.54里面

private static final double INCH_2_CM = 2.54d;

@Override

public boolean canHandle(String fileName) {

assert fileName != null : "fileName should not be null";

return fileName.endsWith("png") || fileName.endsWith("PNG");

}

@Override

public byte[] process(BufferedImage image, int dpi) throws MalformedURLException, IOException {

for (Iterator 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 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);

}

主要参考文章:

https://my.oschina.net/osgit/blog/530283

http://stackoverflow.com/questions/321736/how-to-set-dpi-information-in-an-image

JPEG 处理方式

public class JpegDPIProcessor implements ImageDPIProcessor {

private String formatName = "jpeg";

@Override

public byte[] process(BufferedImage image, int dpi) throws IOException {

for (Iterator iw = ImageIO.getImageWritersByFormatName(formatName); 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);

jfif.setAttribute("Xdensity", dpi + "");

jfif.setAttribute("Ydensity", dpi + "");

jfif.setAttribute("resUnits", "1"); // density is dots per inch

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;

}

@Override

public boolean canHandle(String fileName) {

assert fileName != null : "fileName should not be null";

return fileName.endsWith("jpg") || fileName.endsWith("jpeg") || fileName.endsWith("JPG")

|| fileName.endsWith("JPEG");

}

}

java 300dpi_使用java imageio 调整图片DPI,例如从72调整为300相关推荐

  1. 怎么调整图片dpi大小?如何修改分辨率?

    在我们遇到图片需要修改分辨率(在线修改照片分辨率(DPI) 调整图片DPI 照片dpi修改工具-压缩图)的时候,可以使用压缩图的dpi调整工具在线修改分辨率,一起来看看使用方法吧. 1.打开压缩图网站 ...

  2. 怎么修改图片分辨率提高清晰度?如何调整图片dpi分辨率?

    下载的图片有时候会比较模糊,想要改变图片清晰度的话就需要调整图片分辨率,很多小伙伴都不知道怎么去修改分辨率(在线修改照片分辨率(DPI) 调整图片DPI 照片dpi修改工具-压缩图).今天小编就教大家 ...

  3. java dpi_用java imageio调整图片DPI,例如从96调整为300

    因项目需求把图片的DPI值提升到300,否则OCR识别产生错乱:直接上源码: 1.图片处理接口: package util.image.dpi; import java.awt.image.Buffe ...

  4. 如何调整图片的dpi?如何修改图片分辨率?

    如何修改图片分辨率?推荐使用压缩图的dpi调整工具直接在线修改分辨率(在线修改照片分辨率(DPI) 调整图片DPI 照片dpi修改工具-压缩图),操作简单易上手,快来试试看吧. 1.使用浏览器打开压缩 ...

  5. 怎么调整照片dpi大小?如何提高图片的dpi分辨率?

    平时我们将一张图片放大之后会发现有的图片有明显的模糊感,但是有的就比较清晰,其实这是因为图片分辨率不同画质就不一样,图片分辨率越高清晰度越好.所以为了不影响使用,我们先调整图片分辨率,那么怎么去修改分 ...

  6. 在你的iPad上调整图片尺寸

    本文翻译自Brian's Brain的Resize Images on Your iPad 在我的上一篇文章中,我描述了试图用图片平铺的方式来解决在ipad上展示"大型图片"的问题 ...

  7. 如何调整图片的分辨率?教你如何在线提高照片清晰度

    图片分辨率指的是每英寸图像内有多少个像素点,行业内也称为"像素每英寸",影响着我们图片的清晰度,那么如何调整图片的分辨率呢? 一.修改图片分辨率用什么工具? 很多小伙伴在想要将图片 ...

  8. 修改照片DPI值怎样操作?电脑怎么更改图片DPI?

    很多小伙伴需要修改图片分辨率(https://www.yasuola.com/dpi)时,首先想到的是PS,但PS安装下载麻烦浪费时间.现在市面上有很多图片分辨率在线修改工具,不用下载安装,简单易用, ...

  9. 如何批量调整图片尺寸?

    如何批量调整图片尺寸?在日常的工作中,我们经常需要使用到图片素材,所以如果想要从容地面对各种不同的图片,学会一些图片处理的技巧就非常有必要了,尤其是图片批量处理技巧,当有大量图片需要处理的时候,批量处 ...

最新文章

  1. 2022-2028年中国高粘保护膜行业市场专项调研及发展趋势分析报告
  2. Appcan——Box
  3. WebRTC 的版本号与代码分支
  4. 【APIO2016】Fireworks【闵可夫斯基和】【凸包向量和】【可并堆】
  5. 硒测试中所需的功能和示例
  6. .NET Framework 工具
  7. 工作95视频上传逻辑
  8. spark学习-51-Spark的task任务的运行
  9. [ACM_数据结构] Color the ball [线段树水题][数组开大]
  10. 当 AI 遇见经典,科大讯飞发布两款智能笔记本新品!
  11. Android Studio Error:Connection timed out: connect.解决方案
  12. x64驱动遍历 DPC 定时器
  13. 移动端车牌识别sdk
  14. contourlet matlab 源码,contourlet_toolbox matlab 238万源代码下载- www.pudn.com
  15. 研究生学习生活日记——未来三年的规划
  16. 回望2019,不仅是“自由自在“,更是 AI 领域不平凡的一年
  17. 免费使用 office, Office Standard 2010 (x64) - (Chinese-Simplified) 版本
  18. 基于51单片机的八路抢答器汇编语言Proteus仿真原理图程序
  19. python如何期货交易_能用python的期货交易软件
  20. MySql到MySqli

热门文章

  1. python利用selenium实现自动登陆网页下载内容
  2. 【机器学习算法】Logistic回归分类算法
  3. 什么是TMD的MVP(最小可行性产品)?
  4. 【金九银十】终一搏,BAT、TMD名企精选面试题93道(附解析)
  5. PAT甲级1010TMD的坑
  6. xsl php,XSL是什么以及有什么用
  7. Cisco VPP:cop简介
  8. 用python判断平闰年 ,深入理解 or 和 and
  9. 选公司,就要去上升期的!
  10. 2017年光伏行业可以预见到的三个分水岭