Чтение пикселей с изображений с использованием Java - PullRequest
0 голосов
/ 02 августа 2011

Я пытаюсь преобразовать RGB в изображение GrayScale.

Метод, который выполняет эту задачу, следующий:

public BufferedImage rgbToGrayscale(BufferedImage in)
{
    int width = in.getWidth();
    int height = in.getHeight();

    BufferedImage grayImage = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
    WritableRaster raster = grayImage.getRaster();

    int [] rgbArray = new int[width * height];      
    in.getRGB(0, 0, width, height, rgbArray, 0, width);

    int [] outputArray = new int[width * height];
    int red, green, blue, gray;

    for(int i = 0; i < (height * width); i++)
    {
        red = (rgbArray[i] >> 16) & 0xff;
        green = (rgbArray[i] >> 8) & 0xff;
        blue = (rgbArray[i]) & 0xff;

        gray = (int)( (0.30 * red) + (0.59 * green) + (0.11 * blue));                        

        if(gray < 0)
            gray = 0;
        if(gray > 255)
            gray = 255;

        outputArray[i] = (gray & 0xff);           
        }
    }
    raster.setPixels(0, 0, width, height, outputArray);     

    return grayImage;       
}

У меня есть метод, который сохраняет значение пикселей вфайл:

public void writeImageValueToFile(BufferedImage in, String fileName)
{
    int width = in.getWidth();
    int height = in.getHeight();

    try
    {
        FileWriter fstream = new FileWriter(fileName + ".txt");
        BufferedWriter out = new BufferedWriter(fstream);

        int [] grayArray = new int[width * height];     
        in.getRGB(0, 0, width, height, grayArray, 0, width);

        for(int i = 0; i < (height * width); i++)
        {                       
            out.write((grayArray[i] & 0xff) + "\n");                                
        }

        out.close();
    } catch (Exception e)
    {
        System.err.println("Error: " + e.getMessage());
    }
}

Проблема, с которой я столкнулся, заключается в том, что значение RGB, полученное из моего метода, всегда больше ожидаемого.

Я создал изображение и залил его цветом 128, 128, 128. Согласно первому способу, если я печатаю данные outputArray, я получаю:
r, g, b = 128, 128, 128. Конечный = 127 ---> правильный: D

Однако, когда я вызвал второй метод, я получил значение RGB 187, что неверно.

Любое предложение?

Спасибо !!!

Ответы [ 2 ]

1 голос
/ 02 августа 2011

Взгляните на javax.swing.GrayFilter, он использует класс RBGImageFilter для достижения той же цели и имеет очень похожую реализацию. Это может сделать вашу жизнь проще.

0 голосов
/ 02 августа 2011

Я не эксперт в этих вещах, но не хранятся ли значения RGB в шестнадцатеричном формате (base16)?Если это так, то проблема заключается в вашем предположении, что операция & 0xff приведет к тому, что ваш int будет сохранен / обработан как base16.Это просто запись и использование по умолчанию int в строках всегда будет base10.

    int a = 200;
    a = a & 0xff;
    System.out.println(a);

    // output
    200

Вам необходимо использовать явный метод base16 toString ().

    System.out.println(Integer.toHexString(200));

    // output
    c8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...