Is it possible to remove transparent pixels from a bitmap in android

In my application, I take a screenshot, if the image does not fill the imageView, then transparent pixels are added to the bitmap. You can remove transparent pixels from a bitmap or take a screenshot without transparent pixels. Thanks in advance.

+4
source share
3 answers

I know it's too late, but for some it may be useful. I did this and it works great.

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; 

}

+5
source

This method runs much faster:

 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); } 
+4
source

To crop the transparent frames of an image in Android, you can use this to arrange. Work faster because you don’t have to read all the pixels, just cut the bitmap, more details: 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; } 
-1
source

Source: https://habr.com/ru/post/1484184/


All Articles