从图像中裁剪出白色空间

时间:2017-12-01 02:48:13

标签: android image-processing picasso android-image android-bitmap

我有一个下载图像的服务,并使用毕加索在CardView中显示它。

Picasso.with(context).load(beer.getLabelLarge()).fit().centerCrop().into(imgBeerLabel);

但是这些图像涉及不受欢迎的空白区域:

enter image description here

enter image description here

我想修剪这些图像并仅显示没有白色边框的标签,并将其调整为ImageView尺寸。

- 编辑

白色部分尺寸可变。

问题与此问题中报告的相同:

https://stackoverflow.com/questions/12175991/crop-image-white-space-automatically-using-jquery

但是它已经解决了很多代码,我现在想避免这些代码。

可以帮助我的一个可能的解决方案是将焦点放在图像中的特定方块上并放大该部分,使其填满整个屏幕,而不管白色部分的大小。

预期结果是:

enter image description here

有没有办法使用Picasso和Transformations来做到这一点?

2 个答案:

答案 0 :(得分:2)

我最终根据this library中的代码创建了一个新的Transform实现。

它在垂直和水平方向上查找两侧的第一个不同像素,并从那里裁剪位图。它并不完美,但它符合我的需求。

public class CropMiddleFirstPixelTransformation implements Transformation {
    private int mWidth;
    private int mHeight;


    @Override
    public Bitmap transform(Bitmap source) {
        int width = source.getWidth();
        int height = source.getHeight();

        int[] horizontalMiddleArray = new int[width];
        source.getPixels(horizontalMiddleArray, 0, width, 0, height / 2, width, 1);

        int[] verticalMiddleArray = new int[height];
        source.getPixels(verticalMiddleArray, 0, 1, width / 2, 0, 1, height);

        int left = getFirstNonWhitePosition(horizontalMiddleArray);
        int right = getLastNonWhitePosition(horizontalMiddleArray);

        int top = getFirstNonWhitePosition(verticalMiddleArray);
        int bottom = getLastNonWhitePosition(verticalMiddleArray);

        mWidth = right - left;
        mHeight = bottom - top;


        if (!isNegative(left, right, top, bottom)) {
            return source;
        }

        Bitmap bitmap = Bitmap.createBitmap(source, left, top, mWidth , mHeight);
        source.recycle();
        return bitmap;

    }

    private boolean isNegative(int... values) {
        for (int i : values) {
            if (i < 0) {
                return false;
            }
        }
        return true;

    }

    private int getFirstNonWhitePosition(int[] horizontalMiddleArray) {
        int left = 0;
        for (int i = 0; i < horizontalMiddleArray.length; i++) {
            if (i == 0) {
                left = horizontalMiddleArray[i];
            }
            if (left != horizontalMiddleArray[i]) {
                return i;
            }
        }
        return -1;
    }

    private int getLastNonWhitePosition(int[] horizontalMiddleArray) {
        int right = 0;
        int length = horizontalMiddleArray.length;
        for (int i = length - 1; i > 0; i--) {
            if (i == length - 1) {
                right = horizontalMiddleArray[i];
            }
            if (right != horizontalMiddleArray[i]) {
                return i;
            }
        }
        return -1;
    }


    @Override
    public String key() {
        return "CropMiddleFirstPixelTransformation(width=" + mWidth + ", height=" + mHeight + ")";
    }
}

答案 1 :(得分:0)

使用矢量图像或九个补丁图像的概念。下面给出了

对于矢量图像: - https://developer.android.com/studio/write/vector-asset-studio.html

对于ninePatch图像https://developer.android.com/studio/write/draw9patch.html