2015-01-03 10 views
8

透過領域なしでビットマップを保存したい。Android Bitmap透明領域なしで保存

ビットマップには大きな透明ピクセルがあります。

は、だから私は削除すること

私はこれをどのように行うことができますか?

私は画像を追加できないので、記号で説明してください。

私は機能をトリミングしたくありません。 私は

┌────────────────────────┐透明領域│

│利用フィルタを願っています┌──作物この
└────────┘
│──────┐

└───────────────────── ──

+0

透明領域を色で塗りつぶしたいですか? –

+0

いいえフィルタを使用して透明領域がないクロップビットマップが必要です。 – user1066874

+0

この回答をお試しください:http://stackoverflow.com/a/23774150/2633173 –

答えて

16

ビットマップの不透明領域を見つけるには、ビットマップをxとyで繰り返し、非透明領域の最小値と最大値を見つけます。次に、それらの座標にビットマップをトリミングします。

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

素晴らしい!素敵な!! awsome !!素晴らしい!良い!!作業!!! – user1066874

+0

素敵な仕事が大好き!最後の数日間でこれについて調べるだけ!ありがとうございました ! –

+0

これは本当にうまくいった。しかし、実行にはしばらく時間がかかりました。この仕事をするのが最速の方法ですか? – nitech

4

これを持つ透明な境界線は、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

ここにコードスニペットを追加して、他の人がgithubリポジトリに移動する必要はないでしょうか? –

+0

完了@)MartinGottweis。このコードはすべてのピクセルを読み取るわけではなく、縦横のマトリックスをスライスしているので、テストでは高速でした。 –

+1

この回答は受け入れる必要があります。結果は非常に速い –

関連する問題