用java imageio调整图片DPI,例如从96调整为300
用java imageio调整图片DPI,例如从96调整为300 - 古语云 - 博客园
Excerpt
因项目需求把图片的DPI值提升到300,否则OCR识别产生错乱:直接上源码:1、图片处理接口: 2、JEPG图片的实现类 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 {
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);
}
}