Как установить конкретное значение для любого пикселя в Java? - PullRequest
0 голосов
/ 02 февраля 2012

На самом деле я работаю над каким-то проектом по обработке изображений, и меня где-то поразили.Я должен преобразовать цветное изображение в оттенки серого, и для этого я извлек значения КРАСНЫЙ , ЗЕЛЕНЫЙ , СИНИЙ компонента пикселя, используя GETRGB()Теперь я хочу установить значение RGB этого пикселя равным среднему значению его компонента RGB .Компоненты RGB хранятся в переменных INT соответственно, так что вы можете помочь мне установить среднее значение этих компонентов RGB в исходное значение в пикселях ??Часть кода:

           rgbArray=new int[w*h];
           buffer.getRGB(0, 0, width, height, rgbArray , 0,width );
           int a,r,g,b; 
           for(int i = 0 ; i<w*h; i++)
            { 
              r = (0x00ff0000 & rgbArray[i]) >> 16;
              g = (0x0000ff00 & rgbArray[i]) >> 8;
              b = (0x000000ff & rgbArray[i]);
              rgbArray[i] = (r+g+b)/3;
            }
           buffer.setRGB(0, 0, width, height, rgbArray , 0,width);

, но это не дает мне серое изображение.Можете ли вы сказать, где я делаю ошибку.

Ответы [ 2 ]

0 голосов
/ 03 февраля 2012

Ваш код не упаковывает уровень оттенков серого обратно в каждый компонент цвета. Кроме того, как я сказал в своем комментарии к вопросу, при преобразовании в оттенки серого необходимо учитывать чувствительность человеческого глаза к каждому компоненту цвета. Типичная формула для получения уровня серого

G = 0.30 * R + 0.59 * G + 0.11 * B

как в этой статье Википедии говорится.

Итак, ваша for петля должна выглядеть так:

for(int i = 0 ; i<w*h; i++)
{
    a = (0xff000000 & rgbArray[i]);
    r = (0x00ff0000 & rgbArray[i]) >> 16;
    g = (0x0000ff00 & rgbArray[i]) >> 8;
    b = (0x000000ff & rgbArray[i]);
    int gray = (int)(0.30 * r + 0.59 * g + 0.11 * b);
    if ( gray < 0 ) gray = 0;
    if ( gray > 255 ) gray = 255;
    rgbArray[i] = a | ( gray << 16 ) | ( gray << 8 ) | gray;
}

Конечно, вы можете объявить gray вне цикла, как вы это сделали с r и т. Д.

0 голосов
/ 02 февраля 2012

Не понятно, что вы хотите сделать. Если вы пытаетесь создать серый цвет, я предлагаю обратиться к следующей странице: http://www.tayloredmktg.com/rgb/, которая показывает коды RGB для различных оттенков серого.

Если вы пытаетесь получить полупрозрачное изображение, вы должны использовать альфа-канал (команды RGBA) в Java. Вы также можете получить прозрачность, комбинируя базовое изображение с текущим изображением особыми способами, но это НАМНОГО сложнее, чем с использованием альфа-канала.

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