如何裁剪位图?
裁剪位图!
引言
我之前解释了如何将多个位图合并成一个 这里。 在这个技巧中,我将指导你如何从原始位图的一部分裁剪来创建位图。
使用代码
首先,创建一个大小为 (400px, 400px) 的图像 original.png,如下所示
从该图像创建位图
Bitmap origialBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.original);
创建空位图
Bitmap cutBitmap = Bitmap.createBitmap(origialBitmap.getWidth() / 2,
origialBitmap.getHeight() / 2, Config.ARGB_8888);
通常,要裁剪位图的指定区域,他们会使用。
public void drawBitmap (Bitmap originalBitmap, Rect src, Rect dst, Paint paint)
src
:矩形用于指定在originalBitmap
中将要裁剪的区域-
dst
:在基于src
矩形从originalBitmap
的一个区域裁剪后,结果位图将通过 dst 矩形进行平移/缩放。 根据我的经验,最简单的方法是:src 的大小 = cutbitmap 的大小 = dst 的大小。 这将有助于保持比例。
如何裁剪左上角?
基于上面的解释,如果我们想裁剪 左上角 以获得图像 ①,要创建 src
矩形,请查看下图
要裁剪红色矩形中的位图,我们可以很容易地创建如下 src 矩形
Rect srcRect = new Rect(0, 0, origialBitmap.getWidth() / 2, origialBitmap.getHeight() / 2);
使用上面的 src 裁剪位图,我们将得到
关于 dest
矩形,最简单的方法是将其大小与 cutBitmap
大小相同
Rect srcRect = new Rect(0, 0, origialBitmap.getWidth() / 2, origialBitmap.getHeight() / 2);
绘制位图!
canvas.drawBitmap(origialBitmap, srcRect, desRect, null);
请在设备上查看结果
裁剪 左上角 后,很容易裁剪
右上角
private Bitmap cutRightTop() {
Bitmap origialBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.original);
Bitmap cutBitmap = Bitmap.createBitmap(origialBitmap.getWidth() / 2,
origialBitmap.getHeight() / 2, Config.ARGB_8888);
Canvas canvas = new Canvas(cutBitmap);
Rect desRect = new Rect(0, 0, origialBitmap.getWidth() / 2, origialBitmap.getHeight() / 2);
Rect srcRect = new Rect(origialBitmap.getWidth() / 2, 0, origialBitmap.getWidth(),
origialBitmap.getHeight() / 2);
canvas.drawBitmap(origialBitmap, srcRect, desRect, null);
return cutBitmap;
}
左下角
private Bitmap cutLeftBottom() {
Bitmap origialBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.original);
Bitmap cutBitmap = Bitmap.createBitmap(origialBitmap.getWidth() / 2,
origialBitmap.getHeight() / 2, Config.ARGB_8888);
Canvas canvas = new Canvas(cutBitmap);
Rect srcRect = new Rect(0, origialBitmap.getHeight() / 2, origialBitmap.getWidth() / 2,
origialBitmap.getHeight());
Rect desRect = new Rect(0, 0, origialBitmap.getWidth() / 2, origialBitmap.getHeight() / 2);
canvas.drawBitmap(origialBitmap, srcRect, desRect, null);
return cutBitmap;
}
右下角
private Bitmap cutRightBottom() {
Bitmap origialBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.original);
Bitmap cutBitmap = Bitmap.createBitmap(origialBitmap.getWidth() / 2,
origialBitmap.getHeight() / 2, Config.ARGB_8888);
Canvas canvas = new Canvas(cutBitmap);
Rect desRect = new Rect(0, 0, origialBitmap.getWidth() / 2, origialBitmap.getHeight() / 2);
Rect srcRect = new Rect(origialBitmap.getWidth() / 2, origialBitmap.getHeight() / 2,
origialBitmap.getWidth(),
origialBitmap.getHeight());
canvas.drawBitmap(origialBitmap, srcRect, desRect, null);
return cutBitmap;
}
关注点
缩放比例
如果你想创建包含结果中编号 1 和 2 的位图,首先,src
矩形将是
Rect srcRect = new Rect(0, 0, origialBitmap.getWidth(), origialBitmap.getHeight() / 2);
但是,如果我们保持 cut bitmap 大小和 dest 与旧源代码相同,会发生什么? 这是结果
我们可以看到位图结果的缩放不好。 如何修复? 请使 cut bitmap 的大小和 dest
矩形与 srcRect
相同。
Bitmap cutBitmap = Bitmap.createBitmap(origialBitmap.getWidth(),
origialBitmap.getHeight() / 2, Config.ARGB_8888);
Rect desRect = new Rect(0, 0, origialBitmap.getWidth(),
origialBitmap.getHeight() / 2);
结果将是:
但实际上,有时用户希望创建比 srcRect
大小更小(或更大)的 cutBitmap
。 假设缩放到 0.5。 请注意:
dest = 0.5 * src
Rect desRect = new Rect(0, 0, (int) (origialBitmap.getWidth() * 0.5), (int) (origialBitmap.getHeight() / 2 * 0.5));
之后,基于 desRect
的 cutBitmap
大小是最佳方式。
Bitmap cutBitmap = Bitmap.createBitmap(desRect.width(), desRect.height(), Config.ARGB_8888);
缩放 0.5 的结果将是
总结
要裁剪位图,请
- 首先指定裁剪区域,然后创建
src
矩形。 - 用户想要什么缩放比例? 基于它来创建 dest = ratio * src 。
- 基于
dest
矩形指定cuttingBitmap
大小 是最佳方式。