2013-06-03 3 views
4

В моем приложении я делаю снимок экрана, если изображение не заполняет изображение. Затем прозрачные пиксели добавляются в bitmap. Можно удалить прозрачные пиксели из растрового изображения или сделать снимок экрана без прозрачные пиксели. Спасибо заранее.Можно ли удалить прозрачные пиксели из растрового изображения в android

+0

вы используете PNG? – Hasandroid

+0

Просмотреть содержимое = findViewById (R.id.imageView2); \t \t \t content.setDrawingCacheEnabled (true); Bitmap bitmap = content.getDrawingCache(); – user1083266

+0

Я снимаю экран с помощью этого кода – user1083266

ответ

5

Я знаю, что слишком поздно, но кому-то это может быть полезно. Я сделал это, и он отлично работает.

public static Bitmap createTrimmedBitmap(Bitmap bmp) { 

int imgHeight = bmp.getHeight(); 
int imgWidth = bmp.getWidth(); 
int smallX=0,largeX=imgWidth,smallY=0,largeY=imgHeight; 
int left=imgWidth,right=imgWidth,top=imgHeight,bottom=imgHeight; 
for(int i=0;i<imgWidth;i++) 
{ 
    for(int j=0;j<imgHeight;j++) 
    { 
     if(bmp.getPixel(i, j) != Color.TRANSPARENT){ 
      if((i-smallX)<left){ 
       left=(i-smallX); 
      } 
      if((largeX-i)<right) 
      { 
       right=(largeX-i); 
      } 
      if((j-smallY)<top) 
      { 
       top=(j-smallY); 
      } 
      if((largeY-j)<bottom) 
      { 
       bottom=(largeY-j); 
      } 
     } 
    } 
} 
Log.d(TAG, "left:" + left + " right:" + right + " top:" + top + " bottom:" + bottom); 
bmp=Bitmap.createBitmap(bmp,left,top,imgWidth-left-right, imgHeight-top-bottom); 

return bmp; 

}

+0

, что отличное ан. ! Спасибо дорогой ! –

+0

безупречный! Только подумайте, чтобы убедиться, что перед использованием этого является Config вашего растрового изображения, является ли это «Bitmap.Config.ARGB_8888», если это работает как шарм! –

-1

Для обрезки прозрачных границ посева изображения в Android вы ч использовать это организовать. Работать быстрее, потому что не нужно прочитать все пиксели, это просто кусочек растрового изображения, более подробно: CropTrimTransparentImage

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

Этот метод намного быстрее:

static Bitmap trim(Bitmap source) { 
    int firstX = 0, firstY = 0; 
    int lastX = source.getWidth(); 
    int lastY = source.getHeight(); 
    int[] pixels = new int[source.getWidth() * source.getHeight()]; 
    source.getPixels(pixels, 0, source.getWidth(), 0, 0, source.getWidth(), source.getHeight()); 
    loop: 
    for (int x = 0; x < source.getWidth(); x++) { 
     for (int y = 0; y < source.getHeight(); y++) { 
      if (pixels[x + (y * source.getWidth())] != Color.TRANSPARENT) { 
       firstX = x; 
       break loop; 
      } 
     } 
    } 
    loop: 
    for (int y = 0; y < source.getHeight(); y++) { 
     for (int x = firstX; x < source.getHeight(); x++) { 
      if (pixels[x + (y * source.getWidth())] != Color.TRANSPARENT) { 
       firstY = y; 
       break loop; 
      } 
     } 
    } 
    loop: 
    for (int x = source.getWidth() - 1; x >= firstX; x--) { 
     for (int y = source.getHeight() - 1; y >= firstY; y--) { 
      if (pixels[x + (y * source.getWidth())] != Color.TRANSPARENT) { 
       lastX = x; 
       break loop; 
      } 
     } 
    } 
    loop: 
    for (int y = source.getHeight() - 1; y >= firstY; y--) { 
     for (int x = source.getWidth() - 1; x >= firstX; x--) { 
      if (pixels[x + (y * source.getWidth())] != Color.TRANSPARENT) { 
       lastY = y; 
       break loop; 
      } 
     } 
    } 
    return Bitmap.createBitmap(source, firstX, firstY, lastX - firstX, lastY - firstY); 
} 
+1

Спасибо, мужчина, ваш ответ спас меня. Но я не могу понять, почему это намного быстрее? –

+1

Думаю, я должен был сказать, что это обычно намного быстрее. Сначала он сканирует слева направо, чтобы найти левый самый непрозрачный пиксель. Затем он сканирует сверху вниз, но только смотрит на значения, равные или выше, на эту координату X. Затем делает то же самое с нижнего и правого пикселей. Таким образом, он не должен сканировать все пиксели. –

+2

Кроме того, копирование растрового изображения в массив и обработка этого массива МНОГО быстрее, чем использование Bitmap.getPixel() –