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

color rescaling in java of buffered image

首先感谢阅读

我正在写一个 class 其中 returns 来自二维双数组的图像(代码中的 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();
        }

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

你几乎就在这里:

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 中的正确位置。