缓冲图像的java中的颜色重新缩放

时间:2015-12-09 15:19:48

标签: java colors scaling

首先,感谢阅读。

我正在编写一个从2D双数组返回图像的类(代码中的kDEvalue)。 但是,由于这么多的值(256 * 256)在很小的范围内变化(-1到1),我不能使用默认的颜色缩放(如果我使用数组中的值,它都是黑色的。)

 BufferedImage image = new BufferedImage(kDEvalues.length, kDEvalues[0].length, BufferedImage.TYPE_INT_RGB);
        for (int x = 0; x < 256; x++) {
            for (int y = 0; y < 256; y++) {
                image.setRGB(x, y, (255*(int)Math.round(kDEvalues[x][y]))/100);
            }
        }


        try {
            ImageIO.write(image, "jpg", new File("CustomImage.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }

在这种情况下,我如何以灰度重新缩放颜色,以便我可以看到值的多样性?提前致谢

1 个答案:

答案 0 :(得分:0)

你差一点就在这里:

  

image.setRGB(x,y,(255 *(int)Math.round(kDEvalues [x] [y]))/ 100);

您的表达式对RGB值有三个错误。首先,你转,然后乘。这会丢弃你的小值的任何分数,它应该是相反的方式。其次,你只为一个颜色通道(蓝色的)和第三个颜色通道创建一个值,你不检查溢出。

尝试这样的事情:

int gray = (int) Math.round((kDEvalues[x][y] - (-1)) * 127.5);
// limit range to 0-255
gray = Math.min(gray, 255);
gray = Math.max(gray, 0);
// copy gray value to r, g and b channel
int rgb = (gray << 16) | (gray << 8) | gray;
image.setRGB(x, y, rgb);

第一个操作是将值缩放到0-255。由于您说您的值在-1到1的范围内,因此调整值以使下限落在零上(通过减去下限)。然后乘以一个因子,即高值变为255(即(1 - (-1))* 127.5 = 255)。

为了安全起见,将结果值剪辑为0-255(Math.min / max表达式)。

然后通过将灰度值设置为所有3个颜色通道来复制RGB中的灰度值。格式记录在javadoc中,位移只是将灰度值放在int中的正确位置。