Java 以灰度绘制会产生颜色偏移
我正在研究高程地图层次结构、四叉树,为此,我需要将16位灰度图像形式的高程数据集处理为不同级别的不同图像。这在很大程度上是对输入数据进行下采样 考虑尺寸为14401x10801的输入平铺图像,该图像应绘制为图像512x512的一部分 Draw调用看起来像这样:Java 以灰度绘制会产生颜色偏移,java,image,graphics2d,Java,Image,Graphics2d,我正在研究高程地图层次结构、四叉树,为此,我需要将16位灰度图像形式的高程数据集处理为不同级别的不同图像。这在很大程度上是对输入数据进行下采样 考虑尺寸为14401x10801的输入平铺图像,该图像应绘制为图像512x512的一部分 Draw调用看起来像这样: Graphics2D g2d = (Graphics2D) dstImage.getGraphics(); ... BufferedImage clip = sourceImage.getSubimage(srcX, srcY, srcW
Graphics2D g2d = (Graphics2D) dstImage.getGraphics();
...
BufferedImage clip = sourceImage.getSubimage(srcX, srcY, srcWidth, srcHeight);
g2d.drawImage(clip , dstX, dstY, dstWidth, dstHeight, null);
在哪里
srcX = srcY = 0
srcWidth = 14401
srcHeight = 10801
dstX = dstY = 0
dstWidth = 171
dstHeight = 128
被填充的区域相对而言是正确的,这意味着峰值是它们应该位于的位置。问题是,这些值并不完全符合您的期望。具体来说,dst中的像素0,0肯定是海拔为零的海,但其中绘制了值64
查看src图像的内容
sourceImage.getSubimage( 0, 0,
(int)(srcWidth/(double)dstWidth),
(int)(srcHeight/(double)dstHeight));
应该从src图像中产生更多或更少的值,这些值进入dst中的像素0,0。这些都是零,所以我想问题不是在某个峰值上使值向上摆动。更令人困惑的是,所有应该为零的像素都被设置为64
为了进行此处理(因为java无法处理16位灰度中的负值),所有像素都会提升16384。仅将这些值提高1000会导致错误-229而不是64。值的变化很简单,“添加到所有输入”->“处理”->“从所有输出中减去”
我希望通过简单地处理图像来避免所有的重采样、剪裁和效率问题,但到目前为止,java似乎做了一些模糊的颜色映射
你知道我可能做错了什么吗?所以我稍微修改了一下代码,出于唯一的绝望,我开始关闭那些不应该但可能会产生影响的东西。罪犯原来是
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
这个暗示不。。。提示。。。一个人怎么能从平均数超过84乘以16384得到比16384还多的东西,但嘿,我该评判谁呢
此提示的文档说明
呈现提示是一个提供高级别
关于是否为提高速度而偏向算法选择的建议
或在评估权衡时的质量。任何渲染或图像处理操作都可以参考此提示,但决策通常会优先考虑其他更具体的提示
也不是很有帮助
在java2d中使用渲染提示时,我确实遇到了一些阻碍,似乎确实存在一些问题。无需剪辑图像。只需在目标上的边界外的坐标处绘制它。子图像用于上采样情况,我知道这里没有必要。在下采样时,你能看到相邻像素的插值吗?@jimmyB我不确定,src中与dst中的像素对应的所有像素都是零,所以没有插值吗?@MarkJeronimus现在想一想,你是对的,不确定子图像调用背后的原始动机是什么,当重叠很小时,可能会减少较低级别上的像素丢失量。如果没有这个,你可能会得到最近邻的“插值”。听起来不错。如果我想考虑所有受影响的值,我想我必须实现我自己的取样器。看看我的。它需要每通道16位的支持,但算法都在那里,并且是多线程的(与有缺陷的“java图像缩放”项目相反)。如果你想一起工作,你甚至可以用叉子叉。