quarta-feira, 9 de maio de 2018

Dicas de Programação: Como transformar uma imagem colorida em preto e branco (Android)?

A maneira mais na raça é fazendo uma média aritmética entre o vermelho, verde e azul (RGB) de cada pixel da imagem:

Bitmap image = BitmapFactory.decodeStream(new FileInputStream("image.jpg"));
Bitmap grayImage = Bitmap.createBitmap(image.getWidth(), image.getHeight(), image.getConfig());
for (int x = 0; x < image.getWidth(); x++) {
      for (int y = 0; y < image.getHeight(); y++) {
             int color = image.getPixel(x, y);
             int blue = color & 0xFF; //obtém o valor "azul" do RGB (0,0,255)
             int green = (color & 0xFF00) >> 8; //obtém o valor "verde" do RGB (0,255,0), para isso, se desloca o valor 8 bits para direita
             int red = (color & 0xFF0000) >> 16; //obtém o valor "verde" do RGB (255,255,0), para isso, desloca o  valor 16 bits para direita
             int mid = (blue + green + red) / 3; //média aritmética
             int gray = Color.argb(0xFF, mid, mid, mid);
             grayImage.setPixel(x, y, gray);
      }
}
grayImage.compress(Bitmap.CompressFormat.JPEG, 75, new FileOutputStream("image_gray.jpg"));

A maneira mais fácil (e mais performática), seria mais ou menos esta:

ColorMatrix colorMatrix = new ColorMatrix();
colorMatrix.setSaturation(0f);
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(colorMatrix);
Canvas canvas = new Canvas(grayImage);
Paint paint = new Paint();
paint.setColorFilter(filter);
canvas.drawBitmap(image, 0, 0, paint);


Até mais!

Um comentário:

Anônimo disse...

Obrigado.