因项目需求把图片的DPI值提升到300,否则OCR识别产生错乱:直接上源码:
1、图片处理接口:

package util.image.dpi;

import java.awt.image.BufferedImage;
import java.io.IOException; /**
* 图片处理接口设计
* @author jffan
*
*/
public interface ImageDPIProcessor { /**
* 根据文件后缀扩展名判断是否能进行处理
* @param fileName
* @return
*/
public boolean canHandle(String fileName); /**
* 处理图片,设置图片DPI值
* @param path
* @param dpi dot per inch
* @return
* @throws IOException
*/
public byte[] process(final BufferedImage srcimage, final int dpi) throws Exception;
}

2、JEPG图片的实现类

package util.image.dpi;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Iterator; 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 org.w3c.dom.Element; /**
* JPEG 处理方式
* @author jffan
*
*/
public class JpegDPIProcessor implements ImageDPIProcessor { private String formatName = "jpeg"; /**
* 处理图片,设置图片DPI值
* @param path
* @param dpi dot per inch
* @return
* @throws IOException
*/
@Override
public byte[] process(BufferedImage image, int dpi) throws IOException {
for (Iterator<ImageWriter> 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; } /**
* 根据文件后缀扩展名判断是否能进行处理
* @param fileName
* @return
*/
@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");
}
}

 3、PNG图片的实现类

package util.image.dpi;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Iterator; import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.metadata.IIOInvalidTreeException;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.metadata.IIOMetadataNode;
import javax.imageio.stream.ImageOutputStream; /**
* PNG图片的实现类
* @author jffan
*
*/
public class PngDPIProcessor implements ImageDPIProcessor {
/**
* 1英寸是2.54里面
*/
private static final double INCH_2_CM = 2.54d; /**
* 根据文件后缀扩展名判断是否能进行处理
* @param fileName
* @return
*/
@Override
public boolean canHandle(String fileName) {
assert fileName != null : "fileName should not be null";
return fileName.endsWith("png") || fileName.endsWith("PNG");
} /**
* 处理图片,设置图片DPI值
* @param path
* @param dpi dot per inch
* @return
* @throws IOException
*/
@Override
public byte[] process(BufferedImage image, int dpi) throws MalformedURLException, IOException {
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;
} /**
* 设置图片的DPI值
* @param metadata
* @param dpi
* @throws IIOInvalidTreeException
* @author 范继峰
* @date 2019年7月30日上午10:53:18
* @return void
*/
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);
}
}

  

用java imageio调整图片DPI,例如从96调整为300的更多相关文章

  1. java.imageIo给图片添加水印

    最近项目在做一个商城项目, 项目上的图片要添加水印①,添加图片水印;②:添加文字水印; 一下提供下个方法,希望大家可以用得着: package com.blogs.image; import java ...

  2. 使用java修改图片DPI

    修改以后可以直接用PS打开看效果 全部使用rt下的类,无需下载其他jar包 import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.imag ...

  3. java 导出blob图片到excel

    实现功能,导出当前页面显示员工的图片,核心代码已给出,仅供参考, 如需转载请注明出处http://www.cnblogs.com/wangjianguang/p/7852060.html 随便再扯2句 ...

  4. java实现给图片添加水印

    package michael.io.image; import java.awt.AlphaComposite; import java.awt.Graphics2D; import java.aw ...

  5. java批量转换图片格式

    废话不多直接上代码,代码其实也不多.... package com.qiao.testImage; import java.awt.image.BufferedImage; import java.i ...

  6. java中得到图片的宽度 高度:

    java中得到图片的宽度 高度:BufferedImage srcImage = null;srcImage = ImageIO.read(new File(srcImagePath));int sr ...

  7. Java如何获取图片验证码保存

    举例网站:https://my.1hai.cn/Login/?url=http://www.1hai.cn/ 一.场景:出于安全性考虑,越来越多的Web平台登录都会增加图形验证码(图片),或者短信验证 ...

  8. java实现在图片上编辑文本内容

    package com.yin.text; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; impor ...

  9. 使用java来压缩图片

    使用java来压缩图片,简单几句,清清爽爽 使用0.3的压缩比得到的结果如下(从2.8M压缩到268K,且图片的清晰度看不出明显差别): package carlspringtest; import ...

随机推荐

  1. Multi-Object-Edit With Django FormSets

    I had to write a multi-object edit table the other day for a Django project and as such I dove into ...

  2. mysql中索引类型

    mysql索引类型normal,unique,full text的是什么? normal:表示普通索引 unique:表示唯一的,不允许重复的索引,如果该字段信息保证不会重复例如身份证号用作索引时,可 ...

  3. 爬虫五之Selenium

    Selenium 自动化测试工具,支持多种浏览器: 爬虫中主要用来解决JavaScript渲染问题. 用法详解 基本使用 声明浏览器对象 from selenium import webdriver ...

  4. 【PyTorch】PyTorch中的梯度累加

    PyTorch中的梯度累加 使用PyTorch实现梯度累加变相扩大batch PyTorch中在反向传播前为什么要手动将梯度清零? - Pascal的回答 - 知乎 https://www.zhihu ...

  5. navicat连接 mysql报错1251解决方案

    转自:https://blog.csdn.net/XDMFC/article/details/80263215 好不容易安装好mysql,但又出现了mysql客户端版本太低的问题.根据参考的这篇博客, ...

  6. djangourl进阶

  7. [Python3] 027 常用模块 time

    目录 time 1. 时间戳 2. UTC 时间 3. 夏令时 4. 时间元组 5. 举例 5.1 例子1 例子2 例子3 例子4 例子5 例子6 例子7 time 1. 时间戳 一个时间表示,根据不 ...

  8. JDBC的一些简单通用代码

    JDBC的一些简单通用代码 功能包括 连接数据库 查询操作 执行sql语句 jdbc相关类的加载 关闭连接 获取数据库格式的当前时间 代码 package dao; import java.sql.C ...

  9. ubuntu 个人常用命令

    重启命令 :     1.reboot     2.shutdown -r now 立刻重启    3.shutdown -r 10 过10分钟自动重启    4.shutdown -r 20:35 ...

  10. MLS(移动最小二乘)

    https://blog.csdn.net/weixin_41484240/article/details/81204113 https://blog.csdn.net/baidu_38127162/ ...