【发布时间】:2020-01-29 15:51:17
【问题描述】:
在 Android 中使用坐标系统从左侧/中心侧/右侧裁剪 100 X 100 位图图像的理想方法应该是什么?
假设左侧图像裁剪将提供 1/3 的图像,从坐标 0,0 [左下] 到 33,100 [右上]
右侧裁剪图像将为 66,0 到 100, 100
中心侧裁剪图像将为 33,0 到 66,0
【问题讨论】:
标签: android algorithm matrix bitmap
在 Android 中使用坐标系统从左侧/中心侧/右侧裁剪 100 X 100 位图图像的理想方法应该是什么?
假设左侧图像裁剪将提供 1/3 的图像,从坐标 0,0 [左下] 到 33,100 [右上]
右侧裁剪图像将为 66,0 到 100, 100
中心侧裁剪图像将为 33,0 到 66,0
【问题讨论】:
标签: android algorithm matrix bitmap
您可以查看裁剪的 Glide 或 Fresco 实现。 壁画可以做custom crop
【讨论】:
我认为最简单的方法是创建一个位图并通过创建一个新位图来裁剪该位图:
Bitmap bitmap = ...; // your Bitmap
Bitmap croppedBitmapLeft;
Bitmap croppedBitmapCenter;
Bitmap croppedBitmapRight;
// Left side
croppedBitmapLeft = Bitmap.createBitmap(bitmap, 0, 0, 33, 100);
croppedBitmapCenter = Bitmap.createBitmap(bitmap, 33, 0, 33, 100);
croppedBitmapRight = Bitmap.createBitmap(bitmap, 66, 0, 33, 100);
【讨论】:
如果您想bitmap 裁剪,请尝试Fresco 库。
或者如果你对图像矩阵有足够的了解,你可以试试这个:
final ImageView imageView = (ImageView) findViewById(R.id.imageView);
final Matrix matrix = imageView.getImageMatrix();
final float imageWidth = imageView.getDrawable().getIntrinsicWidth();
final int screenWidth = getResources().getDisplayMetrics().widthPixels;
final float scaleRatio = screenWidth / imageWidth;
matrix.postScale(scaleRatio, scaleRatio);
imageView.setImageMatrix(matrix);
或者您可以自定义您的“ImageView”,例如:
public class ImageViewTopCrop extends ImageView
{
public ImageViewTopCrop(Context context)
{
super(context);
setScaleType(ScaleType.MATRIX);
}
public ImageViewTopCrop(Context context, AttributeSet attrs)
{
super(context, attrs);
setScaleType(ScaleType.MATRIX);
}
public ImageViewTopCrop(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
setScaleType(ScaleType.MATRIX);
}
@Override
protected boolean setFrame(int l, int t, int r, int b)
{
Matrix matrix = getImageMatrix();
float scaleFactor = getWidth()/(float)getDrawable().getIntrinsicWidth();
matrix.setScale(scaleFactor, scaleFactor, 0, 0);
setImageMatrix(matrix);
return super.setFrame(l, t, r, b);
}
}
【讨论】: