簡體   English   中英

緩沖圖像的java中的顏色重新縮放

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM