是否可以从android中的位图中删除透明像素

时间:2013-06-03 11:44:45

标签: android bitmap

在我的应用程序中,如果图像没有填充图像,我会截取屏幕截图,然后将透明像素添加到位图。是否可以从位图中删除透明像素或截取没有透明像素的屏幕截图。提前感谢。

4 个答案:

答案 0 :(得分:10)

这种方法要快得多:

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

答案 1 :(得分:9)

我知道为时已晚,但对某人可能有所帮助。我这样做了,效果很好。

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;

}

答案 2 :(得分:0)

Bitmap imageWithBG = Bitmap.createBitmap(image.getWidth(), image.getHeight(),image.getConfig());  // Create another image the same size
imageWithBG.eraseColor(Color.WHITE);  // set its background to white, or whatever color you want
Canvas canvas = new Canvas(imageWithBG);  // create a canvas to draw on the new image
canvas.drawBitmap(image, 0f, 0f, null); // draw old image on the background
image.recycle();  // clear out old image 

答案 3 :(得分:-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;
}