2015-01-03 6 views
8

Ich möchte Bitmap ohne transparenten Bereich speichern.Android Bitmap speichern ohne transparenten Bereich

Bitmap hat große transparente Pixel.

Deshalb möchte ich entfernen, dass

Wie kann ich das tun?

Ich kann kein Bild hinzufügen, also mit Symbolen erklären.

Ich möchte Funktion nicht zuschneiden. Ich hoffe Verwendung Filter

┌────────────────────────┐

│ transparenten Bereich

│ ┌── ──────┐

│ Ernte dieses
└────────┘
└───────────────────── ───┘

+0

Sie möchten den transparenten Bereich mit Farbe füllen? –

+0

Nein, ich möchte Bitmap ohne transparenten Bereich mit Filter zuschneiden. – user1066874

+0

versuchen Sie diese Antwort: http://StackOverflow.com/A/23774150/2633173 –

Antwort

16

Um den nicht transparenten Bereich Ihrer Bitmap zu finden, durchlaufen Sie die Bitmap in x und y und suchen Sie nach dem Minimum und Maximum der nicht transparenten Region. Schneiden Sie dann die Bitmap auf diese Koordinaten ab.

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

großartig! nett!! fantastisch !! Fantastisch!! gut!! Arbeit!!! – user1066874

+0

super Arbeit Liebe! nur darüber in den letzten paar Tagen zu finden! Danke nochmal ! –

+0

Das hat wirklich super geklappt. Aber es dauerte eine Weile, bis sie ausgeführt wurden. Ist das der schnellste Weg, diesen Job zu machen? – nitech

4

Crop transparente Grenze mit dieser github.

public Bitmap crop (Bitmap bitmap){ 

    int height = bitmap.getHeight(); 
    int width = bitmap.getWidth(); 
    int[] empty = new int[width]; 
    int[] buffer = new int[width]; 
    Arrays.fill(empty,0); 
    int top = 0; 
    int left = 0; 
    int botton = height; 
    int right = width; 

    for (int y = 0; y < height; y++) { 
     bitmap.getPixels(buffer, 0, width, 0, y, width, 1); 
     if (!Arrays.equals(empty, buffer)) { 
      top = y; 
      break; 
     } 
    } 

    for (int y = height - 1; y > top; y--) { 
     bitmap.getPixels(buffer, 0, width, 0, y, width, 1); 
     if (!Arrays.equals(empty, buffer)) { 
      botton = y; 
      break; 
     } 
    } 

    int bufferSize = botton -top +1; 
    empty = new int[bufferSize]; 
    buffer = new int[bufferSize]; 
    Arrays.fill(empty,0); 

    for (int x = 0; x < width; x++) { 
     bitmap.getPixels(buffer, 0, 1, x, top + 1, 1, bufferSize); 
     if (!Arrays.equals(empty, buffer)) { 
      left = x; 
      break; 
     } 
    } 

    for (int x = width - 1; x > left; x--) { 
     bitmap.getPixels(buffer, 0, 1, x, top + 1, 1, bufferSize); 
     if (!Arrays.equals(empty, buffer)) { 
      right = x; 
      break; 
     } 
    } 

    Bitmap cropedBitmap = Bitmap.createBitmap(bitmap, left, top, right-left, botton-top); 
    return cropedBitmap; 
} 
+0

Könnten Sie vielleicht das Code-Snippet hier hinzufügen, so dass andere Leute nicht zum Github Repo gehen müssen? –

+0

Erledigt;) @ MartinGottweis.Dieser Code nicht alle Pixel lesen, schneiden Sie einfach vertikale und horizontale Matrix, so war es in meinen Tests schneller. –

+1

Diese Antwort muss ich akzeptieren. Ergebnis ist so schnell –