2012-06-09 4 views
1

У меня возникли сомнения. Когда я получаю пиксели от Bitmap в Android. У меня есть изображение, загруженное внутри него, это изображение является полутоновым изображением. Если я делаю getPixels() и проверяю значения, я могу видеть значения с помощью R! = G! = B.Проверка битовой карты Android GrayScale

Я думаю, что могу проверить, является ли это в оттенках серого, если значения трех слайдов (R, G и B) то же значение, но я не мог быть возможным. Есть способ проверить это?

Большое спасибо!

ответ

1

Позвольте сначала сказать, что есть несколько путей достижения этого.

Я бы сказал, получить размер изображения, используя (что-то вроде)

int myHeight = myImage.getHeight(); 
int myWidth = myImage.getWidth(); 

Я бы сказал, в этом случае вы также можете проверить конфигурации битовой карты», как это может быть один из 3-х различных форматов

ALPHA_8, ARGB_8888, or RGB_565 

Вы получаете конфигурацию, используя процедуру

myImage.getConfig() 

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

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

boolean isGrayscaleImage = true; // assume it is grayscale until proven otherwise 

for(int i = 0; i < myWidth; i++){ 
    for(int j = 0; j < myHeight; j++){ 
     int currPixel = myImage.getPixel(i, j); 

     if(false == isGrayScalePixel(currPixel)){ 
      isGrayscaleImage = false; 
      break; 
     } 
    } 
} 

Назад к КАК ТЕСТ если пикселы GRAYSCALE: Если изображение хранится в виде ALPHA_8 так ли на самом деле это не изображение в оттенках серого, но оно может быть технически преобразовано в одно, превратив изображение в изображение ARGB_8888 и установив значение Alpha в 0xFF и каждый из компонентов R, G и B на альфа-значение, предоставленное в оригинале 8-разрядное изображение на основе ALPHA_8.

Если изображение RGB_565 отформатировано, это немного сложнее, так как вам придется самостоятельно разделить значения R, G и B в свои собственные байты с помощью операторов shift и MASKING. Как только вы это сделали, это похоже на обработку изображения ARGB_8888 (об этом говорилось ниже).

Для изображения ARGB_8888: альфа-канал ДОЛЖЕН всегда быть 0xFF.

Как указано в вашем вопросе пиксель считается полутоновой если R == G == B SO (Пример кода может выглядеть следующим образом)

boolean isGrayScalePixel(int pixel){ 
    int alpha = (pixel && 0xFF000000) >> 24; 
    int red = (pixel && 0x00FF0000) >> 16; 
    int green = (pixel && 0x0000FF00) >> 8; 
    int blue = (pixel && 0x000000FF); 

    if(0 == alpha && red == green && green == blue) return true; 
    else return false; 

} 

Есть оптимизаций, которые могут быть сделаны, но я Я пытаюсь документировать основной алгоритм для вас.

Надеется, что это помогает вам :-)

+0

Это то, что я сделал, но пиксели в изображении в градациях серого получили разные значения, и я думаю, что вы должны получить то же самое. Это моя проблема. – SamuSan

+0

Ну ......... Вот как вы проверяете, каков ваш вопрос. У вас есть реальный образ, вы открыли его в приложении для обработки изображений и увеличили масштаб, чтобы увидеть, действительно ли есть цвета, которые не оттенки серого ??? – trumpetlicks

+0

Я применяю проверку как шаг предварительной обработки изображения сразу после загрузки без масштабирования или других операций. Если это изображение открывается с помощью Matlab, я нашел его как изображение только с одним слоем, и это изображение в оттенках серого (не индексированное цветное изображение) с пикселами в уровнях от 0 до 255. – SamuSan

1

Обратите внимание на использовании & & (логические И), когда маскирующий должна быть один & (побитовыми И), как показано ниже:

int alpha = (pixel & 0xFF000000) >> 24; 
int red = (pixel & 0x00FF0000) >> 16; 
int green = (pixel & 0x0000FF00) >> 8; 
int blue = (pixel & 0x000000FF); 
0

Если все, что вы нужно проверить, совпадают ли значения R, G и B, а затем просто используйте это с помощью Colors.red(), Colors.green() или Colors.blue().

Вот небольшая часть фактического кода.

for(int x=0;x< bmp.getWidth();x++) { 
    for(int y=0;y< bmp.getHeight();y++) {  

     int pixel=bmp.getPixel(x,y); 
     int alpha=Color.alpha(pixel);    
     int gray_color=Color.red(pixel);   
     int gray_color1=Color.green(pixel); 

     //int gray_color=pixel&0x000000ff; 
     //int gray_color1=(pixel&0x0000ff00)>>8; 
     //int gray_color2=(pixel&0x00ff0000)>>16; 
     //int gray_color3=Math.abs((pixel&0xff000000))>>24; 

     int pixels= (int)Math.pow(gray_color,gamma); 
     k.add(""+alpha+" "+gray_color+" "+gray_color1); 
     bmp.setPixel(x,y,Color.argb(alpha,pixels,pixels,pixels)); 
    } 
} 

Вы можете видеть, что я прокомментировал перемещаемую и маскирующую часть.