Quiero obtener valores RGB de mapa de bits en android, pero no puedo hacerlo hasta ahora. Mi objetivo es obtener los valores RGB de cada píxel del mapa de bits. ¿Hay alguna función específica para android o cualquier otra cosa ??
También me pregunto que necesito colorMatrix() la función?
Es muy importante para mi proyecto. Gracias

InformationsquelleAutor barzos | 2011-04-14

5 Comentarios

  1. 25

    Esto puede ser un poco tarde, pero para aclarar la confusión con el uso de &0xff:

    En Java enteros de 32 bits, por lo que el (A)los valores RGB de cada píxel se embalan en 4 bytes.
    En otras palabras, un píxel con los valores de R(123), G(93), B(49) = FF7B 5D31 en el ARGB_8888 modelo. Donde Alfa = FF, R = 7B, G = 5D, B = 31. Pero este se almacena como un int como -8692431.

    Así, para extraer el valor ecológico de -8692431, necesitamos cambiar la 5D por 8 bits a la derecha, como usted sabe. Esto le da a 00FF 7B5D. Así que, si simplemente nos quedamos a tomar ese valor nos quedaría con 16743261 como nuestro valor de Verde. Por lo tanto, nos bit a bit-y ese valor con la máscara de la 0xFF (que es equivalente a 0000 00FF) y resultará en 00FF 7B5D ser ‘enmascarado’ a 0000 005D. Así que hemos extraído de nuestro valor ecológico de 5D (o 93 decimal).

    Podemos utilizar la misma máscara de 0xFF para cada extracción debido a que los valores han sido cambiado para exponer el deseado de dos bytes como el menos significativo. Por lo tanto el propuesto anteriormente, el código de:

    int p = pixel[index];
    
    int R = (p >> 16) & 0xff;
    int G = (p >> 8) & 0xff;
    int B = p & 0xff;

    Si se hace más clara, se puede realizar la operación equivalente de:

    int R = (p & 0xff0000) >> 16;
    int G = (p & 0x00ff00) >> 8;
    int B = (p & 0x0000ff) >> 0;

    Para mayor brevedad, la extra 0s se puede quitar, y puede ser escrita como

    int R = (p & 0xff0000) >> 16;
    int G = (p & 0xff00) >> 8;
    int B = p & 0xff;

    Nota sin embargo, que la variante de color de los modelos pueden ser utilizados, tales como RGB_555 que almacena cada píxel, ya que sólo 2 bytes, con variaciones en la precisión de los canales RGB. Así que usted debe comprobar el modelo que el mapa de bits está utilizando antes de realizar la extracción, ya que los colores pueden ser almacenados de forma diferente.

    • Hola @QuackSaysHe puede usted por favor responder this pregunta. Creo que no soy la definición de límites para el evento click. Como cuando hago clic en la esquina superior izquierda funciona, pero cuando hago clic en otros rincones de la aplicación se bloquea. Por favor, ayudar. Voy a borrar este comentario una vez que tengo su atención.
  2. 25

    Bitmap.getPixel(x, y) devuelve un int con los valores de color y un valor de alfa integrado en ella.

    int colour = bitmap.getPixel(x, y);
    
    int red = Color.red(colour);
    int blue = Color.blue(colour);
    int green = Color.green(colour);
    int alpha = Color.alpha(colour);
    • Una manera muy fácil para calcular los valores de colores de píxeles. Muchas gracias hombre!!!
  3. 18

    Así es como yo estoy tratando de conseguir ese valor. El uso de mapa de bits.getPixel() para obtener el mapa de bits correspondiente en
    matriz de enteros. Mediante el uso de bit a bit operación de rotación, vamos a obtener los valores RGB.

                 int[] pix = new int[picw * pich];
                 bitmap.getPixels(pix, 0, picw, 0, 0, picw, pich);
    
                 int R, G, B,Y;
    
                 for (int y = 0; y < pich; y++){
                 for (int x = 0; x < picw; x++)
                     {
                     int index = y * picw + x;
                     int R = (pix[index] >> 16) & 0xff;     //bitwise shifting
                     int G = (pix[index] >> 8) & 0xff;
                     int B = pix[index] & 0xff;
    
                     //R,G.B - Red, Green, Blue
                      //to restore the values after RGB modification, use 
     //next statement
                     pix[index] = 0xff000000 | (R << 16) | (G << 8) | B;
                     }}
    • gracias, pero ¿cuál es el significado de &0xff porque ff=11111111. &(y funcionamiento) se obtiene el mismo número con 11111 porque 0&1=1 1&1=1 todo el tiempo. int R = (pix[índice] >> 16) Es suficiente para obtener R ?
    • gracias, pero ¿cuál es el significado de &0xff porque ff=11111111. &(y funcionamiento) se obtiene el mismo número con 11111 porque 0&1=1 1&1=1 todo el tiempo. int R = (pix[índice] >> 16) Es suficiente para obtener R ?
  4. 7

    Una instrucción para menos 😀

    imagen.getPixels(pix, 0, picw, 0, 0, picw, pich);
    
        for (i = 0; i < pix.length; i++) {
            r = (pix[i]) >> 16 & 0xff;
            g = (pix[i]) >> 8 & 0xff;
            b = (pix[i]) & 0xff;
        }
    • Esta es la respuesta correcta ! |Gracias funciona bien 🙂
  5. 4

    Arbitraria De Mapa De Bits De Color De Manejo

    Usted puede leer acerca de los diferentes Color métodos de aquí que se va a extraer los componentes de color de un píxel int.

    Es posible que desee aplicar un filtro de mapa de bits, y devolver una matriz de bytes. De lo contrario, usted puede cortar este ejemplo de abajo a la for-loop y rodar a través de los píxeles de la generación de la matriz de bytes.

    private byte[] rgbValuesFromBitmap(Bitmap bitmap)
    {
    ColorMatrix colorMatrix = new ColorMatrix();
    ColorFilter colorFilter = new ColorMatrixColorFilter(
    colorMatrix);
    Bitmap argbBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(),
    Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(argbBitmap);
    Paint paint = new Paint();
    paint.setColorFilter(colorFilter);
    canvas.drawBitmap(bitmap, 0, 0, paint);
    int width = bitmap.getWidth();
    int height = bitmap.getHeight();
    int componentsPerPixel = 3;
    int totalPixels = width * height;
    int totalBytes = totalPixels * componentsPerPixel;
    byte[] rgbValues = new byte[totalBytes];
    @ColorInt int[] argbPixels = new int[totalPixels];
    argbBitmap.getPixels(argbPixels, 0, width, 0, 0, width, height);
    for (int i = 0; i < totalPixels; i++) {
    @ColorInt int argbPixel = argbPixels[i];
    int red = Color.red(argbPixel);
    int green = Color.green(argbPixel);
    int blue = Color.blue(argbPixel);
    rgbValues[i * componentsPerPixel + 0] = (byte) red;
    rgbValues[i * componentsPerPixel + 1] = (byte) green;
    rgbValues[i * componentsPerPixel + 2] = (byte) blue;
    }
    return rgbValues;
    }
    • Hola @Cameron Lowell Palmer puede usted por favor conteste this pregunta. Creo que no soy la definición de límites para el evento click. Como cuando hago clic en la esquina superior izquierda funciona, pero cuando hago clic en otros rincones de la aplicación se bloquea. Por favor, ayudar.

Dejar respuesta

Please enter your comment!
Please enter your name here