如何解决使用 Java 缩放图像
我创建了一个提取 PDF 的图像,并制作了一个带有 tesseract 的 OCR。一切正常,直到决定更改图像的 dpi。我希望这样做会出错,我尝试重新缩放我的图像,以使我的 OCR 再次正常工作。
我不知道如何重新缩放我的图像。我知道 BufferedImage 类有一些方法,但我找不到动态调整它的方法。
我不知道我是否清楚,但想象一下 300 dpi 的图像。如果我想将其更改为 600,我必须重新缩放我的图像以使我的 OCR 再次工作,我的问题是如何动态重新缩放它?原始 dpi 和新的 dpi 之间是否存在某种比率,我可以使用它来获得新的宽度和高度?还是别的什么?
为了帮助您理解我,这里是我的代码:
public double ratioDPI() {
int ratio = 0;
int minimal_dpi = 300;
int dpi = ERXProperties.intForKey("dpi.image");
return ratio = (dpi/minimal_dpi);
}
public BufferedImage rescale(BufferedImage img) {
int width_img = img.getWidth();
int height_img = img.getHeight();
double factor_width = ERXProperties.doubleForKey("factor.size.width.image.republique.francaise");
double factor_height = ERXProperties.doubleForKey("factor.size.height.image.republique.francaise");
return (BufferedImage) img.getScaledInstance((int)(width_img*ratio),(int)(height_img*ratio),BufferedImage.SCALE_SMOOTH);
}
解决方法
例如,如果您更改图像的 DPI,则会在将其输出到打印机时更改大小。如果将 DPI 从 300 增加到 600,则输出中的图像仅占用一半的宽度和一半的高度。如果现在调整图片大小只会占用更多内存,图片质量不会更好。
对于缩放,最好使用 AffineTransform
,这样您就可以过滤图像 bilinear
,使像素化不那么明显:
缩放函数:
public static BufferedImage scale(BufferedImage source,double scale,boolean bilinearFiltering){
try{
BufferedImage destination = new BufferedImage((int)(source.getWidth() * scale),(int)(source.getHeight() * scale),source.getType());
AffineTransform at = new AffineTransform();
at.scale(scale,scale);
AffineTransformOp scaleOp = new AffineTransformOp(at,getInterpolationType(bilinearFiltering));
return scaleOp.filter(source,destination);
}
catch (Exception e) {
e.printStackTrace();
return null;
}
}
private static int getInterpolationType(boolean bilinearFiltering){
return bilinearFiltering ? AffineTransformOp.TYPE_BILINEAR : AffineTransformOp.TYPE_NEAREST_NEIGHBOR;
}
也许这就是您的解决方案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。