【问题标题】:Trimming image border white space in Java在Java中修剪图像边框空白
【发布时间】:2021-08-15 07:02:29
【问题描述】:
是否有任何可靠的方法可以从PDF 页面或Java 中的BufferedImage 裁剪周围的空白区域,最好只使用开源(Apache 或 MIT 许可)代码?
例如,在逐页处理的 PDF 文档中,算法将是
- 检测每个页面的非空白内容(文本、表格、图像)周围的矩形。
- 比较矩形并选择最大的一个(以便所有页面/图像具有统一的大小)。
- 从每个页面的最大矩形中裁剪出所有内容(所有裁剪出的内容都应为空白)。
主要要求是可靠地实现(3)。直接在 PDF 页面(例如,使用 PDFBox)或在它们的 BufferedImage 对应物上进行操作同样可以。
我已经发布了一个“蛮力”的答案,欢迎任何改进。 :-)
【问题讨论】:
标签:
java
image
whitespace
pdfbox
crop
【解决方案1】:
这是对这个问题的强力回答。
public static BufferedImage trim(BufferedImage image, int rgb) {
int x1 = Integer.MAX_VALUE;
int y1 = Integer.MAX_VALUE;
int x2 = 0;
int y2 = 0;
for (int x = 0; x < image.getWidth(); ++x) {
for (int y = 0; y < image.getHeight(); ++y) {
if (image.getRGB() != rgb) {
x1 = Math.min(x1, x);
y1 = Math.min(y1, y);
x1 = Math.min(x2, x);
y2 = Math.min(y2, y);
}
}
}
WritableRaster raster = image.getRaster().createWritableChild(x1, y1, x2 - x1, y2 - y1, 0, 0, null);
return new BufferedImage(image.getColorModel(), raster, image.getColorModel().isAlphaPremultiplied(), null);
}
上面的解决方案很慢,因为它会遍历所有像素。它还假设要修剪的边缘具有统一的颜色,其值由rgb 参数表示(-1 表示白色)。此外,它会“放大”未修剪的内容,因为它实际上会修剪图像的中心(未修剪)部分。