在Java中修剪图像边框空白

问题描述

是否有任何可靠的方法可以从 PDF 页面BufferedImage 中的 Java 裁剪周围的空白区域,最好仅使用开源(Apache 或 MIT 许可)代码

>

例如,在逐页处理的 PDF 文档中,算法为

  1. 检测每个页面的非空白内容(文本、表格、图像)周围的矩形。
  2. 比较矩形并选择最大的一个(以便所有页面/图像具有统一的大小)。
  3. 从每个页面中最大的矩形中裁剪出所有内容(所有裁剪出的内容都应该是空白)。

主要要求是可靠地实现 (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 表示白色)。此外,它会“放大”未修剪的内容,因为它实际上是裁剪图像的中心(未修剪)部分。