2013-06-25 4 views
-2
public void Only_GREEN() 
{ 

    for(int y=0;y<bi.getHeight();y++) 
    { 

     for(int x=0;x<bi.getWidth();x++) 
     { 

      int rgb = bi.getRGB(x, y); 
      Color c = new Color(rgb); 

      int r=c.getGreen(); 

      rgb = (0xff000000) | (0 << 16) | (r << 8) | (0 << 0); 
      System.out.println("hi",rgb); 
      bi.setRGB(x, y, rgb); 

     } 

    } 

} 

Это код для рисования картины зеленый. Я не могу понять следующие две строки:Обработка изображений понимание

int r=c.getGrenn() 
rgb = (0xff000000) | (0 << 16) | (r << 8) | (0 << 0); 

Что они делают?

ответ

2

Предположим, что a = 0xf000 и b = 0x000f.

x | y является bitwise or. Каждый бит в x, y или оба будут установлены на 1 на результирующем выходе. a | b станет 0xf00f. b | b станет 0x000f.

x << num является left shift. Каждый бит в x будет сдвинут num местами слева. Значения, сдвинутые слева, теряются, новые значения справа равны нулю. b << 4 станет 0x00f0 и a << 4 станет 0x0000.

Итак, давайте разложим код, который вы выбрали. Первая часть, похоже, просто получает зеленое значение как int (которое будет иметь двоичное представление). Вторая часть более интересна:

// Start 
rgb = (0xff000000) | (0 << 16) | (r << 8) | (0 << 0); 

// 1. Do the parts in parentheses. Notice the green value was shifted over two bits 
rgb = 0xff000000 | 0x00000000 | 0x0000rr00 | 0x00000000; 

// 2. Apply the ORs 
rgb = 0xff00rr00; 

Так что же происходит? Похоже, это устанавливает альфа (первые два байта) для всех 1, поэтому цвет непрозрачен. Затем он возвращает красный (второй два байта) и синий (последние два байта). Он сохраняет зеленый цвет, смещая бит в зеленую часть представления RGB. Это работает, потому что RGB hex representation выглядит как 0xAARRGGBB, где A - альфа, R - красный, G - зеленый, а B - синий.

+0

Hey thnx, но не могли бы вы рассказать мне, что такое точное значение r в битах после r = c.getGreen(); – user2485269

+0

@ user2485269 Это будет любое значение, возвращаемое 'getGreen()'. В этом случае, похоже, это зеленое значение для пикселя в данной точке битового массива 'bi' (обратите внимание, что для циклов, проходящих по длине и ширине изображения). Он должен быть целым числом от 0 ('0x00') до 255 (' 0xff'), которое может быть представлено в двух байтах. Java использует знаковые целые числа, поэтому базовые биты будут такими, как '0x00 ... 0gg', где' gg' - это зеленое значение. – thegrinner

1

Функция getGreen() возвращает значение зеленой части цвета.

Цвета часто представлены шестнадцатеричным кодом с шестью символами, первые два символа - красными, следующие два символа зелеными, последние два символа - синими.

(r<<8) сдвигает два зеленых символа на два символа, поэтому он вписывается в стандартный шестнадцатеричный цветовой код. Два шестнадцатеричных символа имеют длину 8 бит, поэтому он сдвинут налево на 8, чтобы поместить зеленое значение в правильное пространство.

Смежные вопросы