[英]color rescaling in java of buffered image
首先,感謝您的閱讀。
我正在寫一個從二維雙精度數組(從代碼中獲取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內的正確位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.