2011-07-16 3 views
8

J'ai un ensemble de bitmaps. Ils sont tous transparents dans une certaine mesure, et je ne sais pas à l'avance quelles parties sont transparentes. Je voudrais créer une nouvelle bitmap hors de l'image originale qui exclut les parties transparentes, mais dans un carré. Je pense que cette image explique:Conversion de bitmap: Création de bitmap qui exclut les côtés transparents de bitmap transparent

enter image description here

Je sais comment créer un bitmap d'un bitmap existant, mais je ne sais pas comment savoir quelle partie est transparente et comment l'utiliser pour atteindre mon but.

Voilà comment je prévois de faire ceci:

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; 
    } 

Est-ce que quelqu'un sait comment y parvenir?

EDIT:

Je l'ai travail en utilisant l'algorithme suivant pour trouver gauche, à droite, en haut et les valeurs du bas:

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

salut, dans ma demande je veux aussi recadrer les pixels transparents me s'il vous plaît aider comment supprimer les pixels transparents de bitmap – user1083266

Répondre

5

Si toutes les images que vous souhaitez rogner sont plus ou moins dans le centre de la toile originale, je suppose que vous pourriez donc quelque chose comme ceci:

  1. début de chaque frontière de travailler votre chemin vers l'intérieur de l'image pour la recherche pixels non transparents
  2. Une fois que vous avez trouvé le pixel en haut à gauche et le bouton en bas à droite, vous obtenez la cible souhaitée.
  3. Copiez l'image que vous plaisez

Maintenant, la question reste est ce que vous considérez comme un pixel transparent. La trasparence alpha compte-t-elle? si oui, combien d'alpha jusqu'à ce que vous décidiez qu'il est suffisamment transparent pour être coupé de l'image?

+0

par pixel transparent Je veux dire pixels avec alpha 0, complètement transparent. Les images que je veux recadrer ne seront pas toujours au centre de la toile d'origine. Ils pourraient même être dans le coin inférieur droit. Cela affecte-t-il votre réponse? – Emiam

+0

Je dirais rechercher le premier en haut à gauche, puis le plus à gauche, le plus à droite et le bas. Sur l'exemple donné, le haut à gauche et le bas à droite couperaient un peu de l'image. – Rob

6

Je pense que cela est un peu plus efficace et il fonctionne très bien pour moi

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

Cela fonctionne parfaitement sur Android 4 - .., ont testé sur 3 appareils. Merci pour votre code, cela a aidé –

0

Pour la zone non transparente de votre bitmap, itérer à travers le bitmap en x et y et trouver le min et max de la région non transparente. Puis recadrez le bitmap à ces coordonnées.

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

Vous avez oublié votre code? http://stackoverflow.com/a/27754016/649379 – SoftDesigner