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 中的正确位置。
首先感谢阅读
我正在写一个 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 中的正确位置。