65.9K
CodeProject 正在变化。 阅读更多。
Home

如何裁剪位图?

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (2投票s)

2013年8月23日

CPOL

2分钟阅读

viewsIcon

41747

downloadIcon

554

裁剪位图!

引言

我之前解释了如何将多个位图合并成一个 这里。 在这个技巧中,我将指导你如何从原始位图的一部分裁剪来创建位图。

使用代码

首先,创建一个大小为 (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)); 

之后,基于 desRectcutBitmap 大小是最佳方式。

Bitmap cutBitmap = Bitmap.createBitmap(desRect.width(), desRect.height(), Config.ARGB_8888); 

缩放 0.5 的结果将是

 

总结 

要裁剪位图,请

  • 首先指定裁剪区域,然后创建 src 矩形。
  • 用户想要什么缩放比例? 基于它来创建 dest = ratio * src 
  • 基于 dest 矩形指定 cuttingBitmap 大小 是最佳方式。  
© . All rights reserved.