2015-07-12 2 views
1

Я использую метод getPixel(), чтобы вернуть значение rgb каждого пикселя в растровое изображение. Затем я использую операторы if() для сравнения значений rgb с моими предопределенными значениями rgb, а затем выполняю код, если утверждение истинно. Как видно из нижеприведенного:с использованием метода getPixel(), а затем проверки значений rgb

for(int x=startX; x<w; x++){ 
      for(int y=startY; y<h; y++){ 
       int pixel = img.getPixel(x, y); 

       if(pixel == Color.rgb(255, 255, 255)); //some code 
       if(pixel == Color.rgb(255, 0, 0)); //some code 
       if(pixel == Color.rgb(255, 255, 0)); //some code 
       if(pixel == Color.rgb(120, 60, 0)); //some code 
} 

Моя проблема заключается в том, что хотя первые три оператора if() выполняются, четвертый никогда не делает. Я знаю, что мое изображение содержит пиксели со всеми этими значениями rgb, потому что я сам сделал изображение. Я предполагаю, что проблема заключается в том, что в цветовом классе нет предопределенной переменной со значением rgb (120,60,0). Так что в основном мне интересно, есть ли вообще вокруг этой проблемы. Может быть, лучший метод, чем getPixel()? Мне просто нужен код в четвертом случае if() для выполнения.

Edit- подробнее:

Мое изображение имеет расширение PNG. Я загрузить его в растр следующим образом:

public static Bitmap loadBitmap(String filename, boolean transparency) { 
     InputStream inputStream = null; 
     try { 
      inputStream = MainActivity.assets.open(filename); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     if (transparency) { 
      options.inPreferredConfig = Bitmap.Config.ARGB_8888; 
     } else { 
      options.inPreferredConfig = Bitmap.Config.RGB_565; 
     } 
     Bitmap bitmap = BitmapFactory.decodeStream(inputStream, null, 
       options); 
     return bitmap; 
    } 

Изображение извлекается за счет активов переменной, которая является статической переменной в моем классе MainActivity типа AssetManager. Я инициализирую эту переменную, указав assets = getassets(). Мое изображение находится внутри папки моих ресурсов, которую затем извлекает AssetManager.

+0

Как вы создаете и загружаете растровое изображение? Какую плотность цвета он имеет? Какой тип файла он хранит? – AterLux

+0

только что отредактировал для вас –

+1

, когда RGB_565 возможно никогда не иметь 120, 60 значений – AterLux

ответ

0

Я делаю то же самое в одном из своих приложений, и getPixel() работает отлично. Я думаю, проблема в том, что вы используете Bitmap.Config.RGB_565.

В этом формате каждый пиксель не имеет 1 байт (8 бит) на каждый цветной канал (красный, зеленый, синий). Но он обеспечивает 5 бит (0-31) для RED, 6 бит (0-63) для GREEN и 5 бит для BLUE.

Поэтому, когда вы помещаете пиксели из PNG в растровое изображение RGB_565, они будут масштабироваться от 256 возможных значений для каждого цветового канала до 32 значений для RED и BLUE каналов и до 64 значений для GREEN.

Обратите внимание, что это преобразование не является линейным. Это означает, что вы не можете просто разделить значение RED из PNG на 8 и получить RED значение RGB_565.

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