Is it possible to remove transparent pixels from b

2020-06-03 09:15发布

In my application i am taking screenshot if the image doesn't fill imageView then transparent pixels are added to bitmap.Is it possible to remove transparent pixels from bitmap or take screenshot without transparent pixels.Thanks in advance.

3条回答
甜甜的少女心
2楼-- · 2020-06-03 10:07

I have done this way 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;

}
查看更多
够拽才男人
3楼-- · 2020-06-03 10:11

To trim crop transparent borders of a image in Android you ca use this arrange. Work faster because don't need read all pixels, it just slice 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;
}
查看更多
欢心
4楼-- · 2020-06-03 10:16

This method is a lot 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.getWidth(); 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);
}
查看更多
登录 后发表回答