因项目需求把图片的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. ElasticSearch的中文分词器ik

    一.前言   为什么要在elasticsearch中要使用ik这样的中文分词呢,那是因为es提供的分词是英文分词,对于中文的分词就做的非常不好了,因此我们需要一个中文分词器来用于搜索和使用. 二.IK ...

  2. Mac_Navicat Premium连接MySQL错误2059 - Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(../Frameworks/caching_sha2_password.so, 2): image not found

    mac下MySql启动连接报错:Authentication plugin ‘caching_sha2_password’ cannot be loaded: dlopen(/usr/local/my ...

  3. 【Qt开发】QScrollArea添加布局后没有出现滚动条的解决方法

    [Qt开发]QScrollArea添加布局后没有出现滚动条的解决方法 标签:[Qt开发] 说明:尝试利用滚动区域显示多张图片,为了能够动态地往滚动区域贴图,为滚动区域设置了布局,然后通过布局来添加wi ...

  4. 关于多线程efcore dbcontext 的解决方案。

    首先我们大部分的efcore框架用的DbContext(或者封装的repo)都是底层注入的上下文容器实体. 然后Dbcontext不是线程安全的,也就是说,你在当前线程中,只能创建一个 DbConte ...

  5. Linux下用Java获取本机IP

    可能有多个网卡包括虚拟网卡,需要进行排除 String ip = ""; try { Enumeration<?> e1 = NetworkInterface.getN ...

  6. swagger生成文档初步使用

    在大部分情况下,公司都会要求提供详细的接口文档,对于开发来说,文档有时候在赶进度的情况下,也是一件头疼的事.而swagger的自动生成文档功能,就可以帮助我们减少工作量,对于文档的修改也可以在代码中随 ...

  7. show slave status 命令判断MySQL复制同步状态

    1. show slave status命令可以显示主从同步的状态 MySQL> show slave status \G; *************************** 1. row ...

  8. Python流程控制与while 循环(day01)

    一:流程控制 假如把写程序比做走路,那我们到现在为止,一直走的都是直路,还没遇到过分叉口,想象现实中,你遇到了分叉口,然后你决定往哪拐必然是有所动机的.你要判断哪条叉路是你真正要走的路,如果我们想让 ...

  9. axios中设置Content-Type不生效的问题

    Api:axios(config): config中无data字段时,headers里的Content-Type无效果,这应该出于优化的层面,此时的Content-Length=0,无需向服务端提供C ...

  10. Dango之初识安装

    1. MVC和MTV框架 1.1MVC Web服务器开发领域里著名的MVC模式 所谓MVC就是把Web应用分为模型(M), 控制器(C)和视图(V)三层,他们之间以一种插件式的.松耦合的方式连接在一起 ...