2011-07-16 20 views
8

Tengo un conjunto de mapas de bits. Todos son transparentes en cierta medida, y no sé de antemano qué partes son transparentes. Me gustaría crear un nuevo mapa de bits fuera del mapa de bits original que excluye las partes transparentes, pero en un cuadrado. Creo que esta imagen lo explica:Conversión de mapa de bits: crear un mapa de bits que excluya los lados transparentes del mapa de bits transparente

enter image description here

sé cómo crear un mapa de bits de un mapa de bits existente, pero no sé cómo averiguar qué parte es transparente y cómo utilizar eso para lograr mi meta.

Esta es la forma en que planeo hacer esto:

public Bitmap cutImage(Bitmap image) { 
     Bitmap newBitmap = null; 

     int width = image.getWidth(); 
     int height = image.getHeight(); 

     newBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 

     Canvas canvas = new Canvas(newBitmap); 

     //This is where I need to find out correct values of r1 and r1. 

     Rect r1 = new Rect(?, ?, ?, ?); 
     Rect r2 = new Rect(?, ?, ?, ?); 

     canvas.drawBitmap(image, r1, r2, null); 

     return newBitmap; 
    } 

¿Alguien sabe cómo lograr esto?

EDIT:

Tengo que funcione utilizando el siguiente algoritmo para encontrar a la izquierda, derecha, arriba y los valores inferiores:

private int x1; 
private int x2; 
private int y1; 
private int y2; 

private void findRectValues(Bitmap image) 
{ 
    for(int x = 0; x < image.getWidth(); x++) 
    { 
     for(int y = 0; y < image.getHeight(); y++) 
     { 
      if(image.getPixel(x, y) != Color.TRANSPARENT) 
      { 
       System.out.println("X1 is: " + x); 
       x1 = x; 
       break; 
      } 
     } 

     if(x1 != 0) 
      break; 

    } 

    for(int x = image.getWidth()-1; x > 0; x--) 
    { 
     for(int y = 0; y < image.getHeight(); y++) 
     { 
      if(image.getPixel(x, y) != Color.TRANSPARENT) 
      { 
       System.out.println("X2 is: " + x); 
       x2 = x; 
       break; 
      } 
     } 

     if(x2 != 0) 
      break; 

    } 

    for(int y = 0; y < image.getHeight(); y++) 
    { 
     for(int x = 0; x < image.getWidth(); x++) 
     { 
      if(image.getPixel(x, y) != Color.TRANSPARENT) 
      { 
       System.out.println("Y1 is: " + y); 
       y1 = y; 
       break; 
      } 
     } 

     if(y1 != 0) 
      break; 

    } 

    for(int y = image.getHeight()-1; y > 0; y--) 
    { 
     for(int x = 0; x < image.getWidth(); x++) 
     { 
      if(image.getPixel(x, y) != Color.TRANSPARENT) 
      { 
       System.out.println("Y2 is: " + y); 
       y2 = y; 
       break; 
      } 
     } 

     if(y2 != 0) 
      break; 

    } 
} 
+0

hola, en mi solicitud también quiero recortar los píxeles transparentes por favor me ayudan a cómo quitar píxeles transparentes de mapa de bits – user1083266

Respuesta

5

Si todas las imágenes que desea recortar son más o menos en el centro de la tela original, supongo que se podría por lo menos así:

  1. inicio de cada frontera de su forma de trabajo hacia el interior en busca de la imagen píxeles no transparentes
  2. Una vez que haya encontrado el píxel superior izquierdo y el inferior derecho, tendrá el objetivo deseado.
  3. Copiar la imagen como desee

Ahora, la pregunta queda es lo que se tiene en cuenta un píxel transparente. ¿La transparencia alfa cuenta? de ser así, ¿cuánto alfa hasta que decida que es lo suficientemente transparente como para cortarlo de la imagen?

+0

Por píxel transparente quiero decir píxeles con alfa 0, completamente transparente. Las imágenes que quiero recortar no siempre estarán en el centro del lienzo original. Incluso podrían estar en la esquina inferior derecha. ¿Esto afecta tu respuesta? – Emiam

+0

Yo diría buscar el primero desde la esquina superior izquierda, luego la izquierda más, más a la derecha y abajo. En el ejemplo dado, arriba a la izquierda y abajo a la derecha cortarían un poco de la imagen. – Rob

6

creo que esto es un poco más eficiente y funciona muy bien para mí

public Bitmap cropBitmapToBoundingBox(Bitmap picToCrop, int unusedSpaceColor) { 
    int[] pixels = new int[picToCrop.getHeight() * picToCrop.getWidth()]; 
    int marginTop = 0, marginBottom = 0, marginLeft = 0, marginRight = 0, i; 
    picToCrop.getPixels(pixels, 0, picToCrop.getWidth(), 0, 0, 
      picToCrop.getWidth(), picToCrop.getHeight()); 

    for (i = 0; i < pixels.length; i++) { 
     if (pixels[i] != unusedSpaceColor) { 
      marginTop = i/picToCrop.getWidth(); 
      break; 
     } 
    } 

    outerLoop1: for (i = 0; i < picToCrop.getWidth(); i++) { 
     for (int j = i; j < pixels.length; j += picToCrop.getWidth()) { 
      if (pixels[j] != unusedSpaceColor) { 
       marginLeft = j % picToCrop.getWidth(); 
       break outerLoop1; 
      } 
     } 
    } 

    for (i = pixels.length - 1; i >= 0; i--) { 
     if (pixels[i] != unusedSpaceColor) { 
      marginBottom = (pixels.length - i)/picToCrop.getWidth(); 
      break; 
     } 
    } 

    outerLoop2: for (i = pixels.length - 1; i >= 0; i--) { 
     for (int j = i; j >= 0; j -= picToCrop.getWidth()) { 
      if (pixels[j] != unusedSpaceColor) { 
       marginRight = picToCrop.getWidth() 
         - (j % picToCrop.getWidth()); 
       break outerLoop2; 
      } 
     } 
    } 

    return Bitmap.createBitmap(picToCrop, marginLeft, marginTop, 
      picToCrop.getWidth() - marginLeft - marginRight, 
      picToCrop.getHeight() - marginTop - marginBottom); 
} 
+1

Esto funciona perfectamente en Android 4 - .., ha probado en 3 dispositivos. Gracias por su código, ayudó –

0

Para encontrar el área no transparente de su mapa de bits, iterar a través del mapa de bits en X e Y y encontrar el mínimo y máximo de la región no transparente. Luego recorta el mapa de bits a esas coordenadas.

Bitmap CropBitmapTransparency(Bitmap sourceBitmap) 
{ 
    int minX = sourceBitmap.getWidth(); 
    int minY = sourceBitmap.getHeight(); 
    int maxX = -1; 
    int maxY = -1; 
    for(int y = 0; y < sourceBitmap.getHeight(); y++) 
    { 
     for(int x = 0; x < sourceBitmap.getWidth(); x++) 
     { 
      int alpha = (sourceBitmap.getPixel(x, y) >> 24) & 255; 
      if(alpha > 0) // pixel is not 100% transparent 
      { 
       if(x < minX) 
        minX = x; 
       if(x > maxX) 
        maxX = x; 
       if(y < minY) 
        minY = y; 
       if(y > maxY) 
        maxY = y; 
      } 
     } 
    } 
    if((maxX < minX) || (maxY < minY)) 
     return null; // Bitmap is entirely transparent 

    // crop bitmap to non-transparent area and return: 
    return Bitmap.createBitmap(sourceBitmap, minX, minY, (maxX - minX) + 1, (maxY - minY) + 1); 
} 
+0

¿Olvidó los créditos? http://stackoverflow.com/a/27754016/649379 – SoftDesigner

Cuestiones relacionadas