Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以灰度绘制会产生颜色偏移_Java_Image_Graphics2d - Fatal编程技术网

Java 以灰度绘制会产生颜色偏移

Java 以灰度绘制会产生颜色偏移,java,image,graphics2d,Java,Image,Graphics2d,我正在研究高程地图层次结构、四叉树,为此,我需要将16位灰度图像形式的高程数据集处理为不同级别的不同图像。这在很大程度上是对输入数据进行下采样 考虑尺寸为14401x10801的输入平铺图像,该图像应绘制为图像512x512的一部分 Draw调用看起来像这样: Graphics2D g2d = (Graphics2D) dstImage.getGraphics(); ... BufferedImage clip = sourceImage.getSubimage(srcX, srcY, srcW

我正在研究高程地图层次结构、四叉树,为此,我需要将16位灰度图像形式的高程数据集处理为不同级别的不同图像。这在很大程度上是对输入数据进行下采样

考虑尺寸为14401x10801的输入平铺图像,该图像应绘制为图像512x512的一部分

Draw调用看起来像这样:

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图像缩放”项目相反)。如果你想一起工作,你甚至可以用叉子叉。