问题描述
是否有任何可靠的方法可以从 PDF
页面或 BufferedImage
中的 Java
裁剪周围的空白区域,最好仅使用开源(Apache 或 MIT 许可)代码?
例如,在逐页处理的 PDF 文档中,算法为
主要要求是可靠地实现 (3)。直接在 PDF 页面上操作(例如,使用 PDFBox)或在它们的 BufferedImage 对应页面上操作同样可以。
我已经发布了一个“蛮力”答案,欢迎任何改进。 :-)
解决方法
这是对这个问题的暴力回答。
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,null);
return new BufferedImage(image.getColorModel(),raster,image.getColorModel().isAlphaPremultiplied(),null);
}
上面的解决方案很慢,因为它遍历了所有像素。它还假设要修剪的边缘具有统一的颜色,其值由 rgb
参数表示(-1
表示白色)。此外,它会“放大”未修剪的内容,因为它实际上是裁剪图像的中心(未修剪)部分。