簡體   English   中英

BufferedImage顏色意外更改

[英]BufferedImage unexpectedly changing color

我有以下代碼,該代碼創建灰度BufferedImage,然后設置每個像素的隨機顏色。

import java.awt.image.BufferedImage;

public class Main {

    public static void main(String[] args) {
        BufferedImage right = new BufferedImage(100, 100, BufferedImage.TYPE_BYTE_GRAY);
        int correct = 0, error = 0;
        for (int i = 0; i < right.getWidth(); i++) {
            for (int j = 0; j < right.getHeight(); j++) {
                int average = (int) (Math.random() * 255);
                int color = (0xff << 24) | (average << 16) | (average << 8) | average;
                right.setRGB(i, j, color);
                if(color != right.getRGB(i, j)) {
                    error++;
                } else {
                    correct++;
                }
            }
        }
        System.out.println(correct + ", " + error);
    }
}

在大約25%到30%的像素中會發生奇怪的行為,我在其中設置了顏色,然后立即設置了與先前設置不同的值。 我是否以錯誤的方式設置顏色?

我認為您的問題與圖片類型有關(BufferedImage構造函數的第三個參數)。 如果將類型更改為BufferedImage.TYPE_INT_ARGB ,則將獲得100%正確的結果。

查看BufferedImage.getRGB(int,int)的文檔,當您獲得不是默認顏色空間的RGB時會有一些轉換

返回默認RGB顏色模型(TYPE_INT_ARGB)和默認sRGB顏色空間中的整數像素。 如果此默認模型與圖像ColorModel不匹配,則會進行顏色轉換。

因此,您可能會看到由於轉換而導致的不匹配。

這是您的解決方案:禁止getRGB並使用Raster(比getRGB更快,更容易)甚至更好的DataBuffer(最快,但必須處理編碼):

import java.awt.image.BufferedImage;

public class Main
{

public static void main(String[] args)
    {
    BufferedImage right = new BufferedImage(100, 100, BufferedImage.TYPE_BYTE_GRAY);
    int correct = 0, error = 0;
    for (int x=0 ; x < right.getWidth(); x++)
        for (int j = 0; j < right.getHeight(); j++)
            {
            int average = (int) (Math.random() * 255) ;
            right.getRaster().setSample(x, y, 0, average) ;
            if ( average != right.getRaster().getSample(x, y, 0) ) error++ ;
            else correct++;
            }
    System.out.println(correct + ", " + error);
    }
}

在您的情況下,getRGB太糟糕了,因為編碼是一個字節數組(8位),並且您必須使用getRGB操縱RGB值。 柵格將為您完成所有轉換工作。

胡亂猜測:

刪除(0xff << 24)| 這是Alpha通道,顏色不透明/不透明。 給定是/否透明,並且平均應用透明度為<或> = 128,則25%可能是錯誤的顏色映射(非常瘋狂的猜測)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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