我有一个下载图像的服务,并使用毕加索在CardView中显示它。
Picasso.with(context).load(beer.getLabelLarge()).fit().centerCrop().into(imgBeerLabel);
但是这些图像涉及不受欢迎的空白区域:
我想修剪这些图像并仅显示没有白色边框的标签,并将其调整为ImageView尺寸。
- 编辑
白色部分尺寸可变。
问题与此问题中报告的相同:
https://stackoverflow.com/questions/12175991/crop-image-white-space-automatically-using-jquery
但是它已经解决了很多代码,我现在想避免这些代码。
可以帮助我的一个可能的解决方案是将焦点放在图像中的特定方块上并放大该部分,使其填满整个屏幕,而不管白色部分的大小。
预期结果是:
有没有办法使用Picasso和Transformations来做到这一点?
答案 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