1

我想调整 Java BufferedImage 的大小,使其垂直变小,但不使用任何类型的平均,这样如果源图像中的像素行是“空白”(白色),则在目标图像的对应位置:“min”操作。默认算法(在getScaledInstance中指定)不允许我进行足够细粒度的控制。我想实现以下逻辑:

for each pixel row in the w-pixels wide destination image, d = pixel[w]
   find the corresponding j pixel rows of the source image, s[][] = pixel[j][w]
   write the new line of pixels, so that d[i] = min(s[j][i]) over all j, i

我一直在阅读RescaleOp,但还没有弄清楚如何实现这个功能——这无疑是一种奇怪的缩放类型。任何人都可以为我提供有关如何执行此操作的指示吗?在更糟糕的情况下,我想我可以保留目标 ImageBuffer 并按照伪代码复制像素,但我想知道是否有更好的方法。

4

1 回答 1

1

RescaleOp 方法包括一个称为 RenderingHints 的参数。有一个名为的提示KEY_INTERPOLATION决定了缩放图像时要使用的颜色。

如果您使用VALUE_INTERPOLATION_NEAREST_NEIGHBORKEY_INTERPOLATION 的值,Java 将使用原始颜色,而不是使用某种类型的算法来重新计算新颜色。

所以,不是白线变成灰色或混合颜色,你会得到白线,或者你根本不会得到任何线条。这完全取决于比例因子,以及它是偶数行还是奇数行。例如,如果您将比例缩小一半,则每条 1 像素的水平线在新图像中出现的变化至少为 50%。但是,如果白线的高度为两个像素,那么您将有 100% 的机会出现白线。

除了编写自己的缩放方法之外,这可能是您将获得的最接近的方法。不幸的是,我没有看到任何其他可能有帮助的提示。

要实现自己的缩放方法,您可以创建一个实现BufferedImageOp接口的新类,并实现该filter()方法。在 BufferedImage 对象上使用getRGB()setRGB()从原始图像中获取像素并在新图像上设置像素。

于 2010-03-29T18:12:44.380 回答