Java绘制图像插值

3
我的问题涉及Java Graphics2D中的drawImage方法(这是针对桌面应用程序而非Android的)。
我希望绘制的BufferedImage包含高分辨率的二进制数据,大多数像素为黑色,但我有一些稀疏的绿色像素(绿色像素表示来自原始数据流的数据点)。位图相当大,比我的典型面板大小要大。我之所以将它做得这么大是因为我可以放大和缩小。问题是,当我缩小时,我会失去一些绿色像素。例如,如果我的图像为1000像素,面板为250像素,则在每个方向(X和Y)上都会丢失1个像素中的4个像素。如果我在缩放时使用最近邻插值法,则像素可能会消失成黑色。如果我使用双线性插值之类的东西,我的绿色像素将被重新着色为黑色和绿色之间的某个颜色。
我理解所有这些行为,但我的问题是是否有任何方式可以获得我想要的行为,即确保如果任何像素不是黑色,我希望它以其完整强度进行绘制。也许有一些“最大持有”插值之类的东西。
我意识到我可能可以通过在黑色背景上绘制形状原语来做我想做的事情,也许这就是我必须做的。但我使用位图(与我在下降谱图类型显示器中显示数据有关 - 它确实有一种模式,其中所有像素都可以着色而不仅仅是黑色和绿色)。
谢谢。

你可以使用自己的插值算法逐像素扫描图像并进行绘制,但这可能会很慢。你也可以尝试在JAIImageJ上找到一些相关内容。但出于性能考虑,我真的认为你应该使用绘图基元来渲染场景。 - Gilberto Torrezan
不是每个方向都失去四分之一的像素,而是三分之一。 - Andrew Thompson
@oldrinb RescaleOp 不用于改变图像的大小,而是用于在像素的颜色值上应用线性函数。 - Arash Shahkar
1个回答

0
你可以查看drawImage的实现并覆盖它以获得所需的行为,但是可能缩放的核心使用了硬件加速,因此在Java中重新实现它会非常慢。
你可以研究JOGL,但我的印象是,如果你的像素非常稀疏,只需在黑色背景上(或在图像上方)绘制绿色像素即可轻松编码且非常快速。您甚至可以使用启发式切换来在点数开始变得过高时在绘制点和缩放图像之间进行切换。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接