调整高大的BufferedImage大小时如何保持/支持某些像素值?

时间:2010-07-22 12:12:43

标签: java graphics image image-processing resize

我有一个非常高的BufferedImage(像1100像素高),并不是特别宽(可能是200-300像素)。图像由数据图组成,但大多数像素表示不太有趣的背景颜色/值。我的问题是,当图像从1100像素的高度调整到200-300像素的大小时,实际包含有趣数据的许多像素被背景颜色像素破坏。有没有办法告诉Java 2D重新缩放算法我更喜欢某些值的像素(或更好,我想降低背景颜色的优先级),同时重新缩放?我使用以下代码片段重新缩放图像:

BufferedImage resized = new BufferedImage(width, height, imageType);
Graphics2D graphics2D = resized.createGraphics();
graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); //Has worked best in my case
graphics2D.drawImage(source, 0, 0, width, height, null);
graphics2D.dispose();

我确信在Java中调整图像大小的方法更有效,但这并不重要(至少目前不是这样)。

一种无聊的事情是我之前使用过一个库(不再使用它),它实际上设法保留了大量代表像素的有价值的数据。

请注意,如果有任何帮助,我手边有原始像素数据(2D int数组)。该应用程序将处理许多不同大小的图像,所以我不确定高度必须是1100像素。

感谢。

1 个答案:

答案 0 :(得分:2)

您是否尝试在渲染提示中启用消除锯齿功能?这可能有所帮助。

如果没有,你可以很容易地编写自己的缩放功能。这实际上非常简单 - 你只需要:

  • 遍历目标BufferedImage中的所有点
  • 对于每个循环在原始像素数据中的相关点(这将是由缩放系数确定的矩形区域)
  • 根据原始像素值使用您选择的公式计算目标颜色
  • 使用BufferedImage.setRGB(...)设置目标像素的颜色

正常的抗锯齿会使用类似源像素值的平均值作为公式,听起来你想要一些优先于特定值的东西(例如,如果背景像素的颜色值较低,则取最大像素值)