2015-01-03 14 views
8

Chcę zapisać bitmapę bez przezroczystego obszaru.Zapisywanie bitmap na Androida bez przezroczystego obszaru

Mapa bitowa ma duży przezroczysty piksel.

Więc chcę usunąć to

Jak mogę to zrobić?

Nie mogę dodać zdjęcia, więc wyjaśnij za pomocą symboli.

Nie chcę przycinać funkcji. Mam nadzieję filtr używać

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

│ przezroczystego obszaru

│ ┌── ──────┐

│ przyciąć to
└────────┘
└───────────────────── ───┘

+0

Chcesz wypełnić przezroczysty obszar kolorem? –

+0

Nie chcę mapować bitmapy bez przezroczystego obszaru przy użyciu filtru. – user1066874

+0

spróbuj tej odpowiedzi: http://stackoverflow.com/a/23774150/2633173 –

Odpowiedz

16

Aby znaleźć nieprzejrzysty obszar mapy bitowej, należy powtórzyć bitmapę w punktach x i y oraz znaleźć min i maksimum nieprzejrzystego regionu. Następnie przycinaj bitmapę do tych współrzędnych.

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

super !! miły!! świetny !! fantastyczny!! dobry!! praca!!! – user1066874

+0

Świetna robota, kochanie! po prostu znajdowanie o tym od kilku ostatnich dni! Jeszcze raz dziękuję ! –

+0

To zadziałało naprawdę świetnie. Ale wykonanie egzekucji zajęło trochę czasu. Czy to najszybszy sposób na zrobienie tej pracy? – nitech

4

Crop przejrzysty granicy z tym 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

Czy możesz dodać tutaj fragment kodu, aby inni nie musieli iść na repozytorium github? –

+0

Wykonano;) @ MartinGottweis. Ten kod nie odczytał wszystkich pikseli, po prostu wycinaj pionową i poziomą matrycę, więc w moich testach był szybszy. –

+1

ta odpowiedź musi mnie zaakceptować. Wynik jest tak szybki. –

Powiązane problemy