如何在 Android Canvas 中剪出一个矩形

Posted

技术标签:

【中文标题】如何在 Android Canvas 中剪出一个矩形【英文标题】:How to cut a rect out in Android Canvas 【发布时间】:2011-05-05 13:38:28 【问题描述】:

我创建了一个 RoundRec。

canvas.drawRoundRect(new RectF(0, 0, 100, 10), 7, 7, paint);

但是我只想要上面的两个圆角,所以我需要把底部的半边 Rect(0, 0, 0, 5) 剪掉,只留下半边。

我该怎么办?

【问题讨论】:

你打算如何处理这样的对象? 【参考方案1】:

这里的解决方案: How to Cut a Bitmap

第二个:

矩形 srcRect = new Rect(0, 0, origialBitmap.getWidth() / 2, origialBitmap.getHeight() / 2);

应该是destRect!。

请记住,“destRect”的坐标必须等于

"0, 0,destinationBitmap.getWidth(),destinationBitmap.getHeight()"

并且没有相同的“srcRect”坐标。链接中的示例有点奇怪,因为它使用“originalBitmap”来获取“destRect”,但“destRect”不属于“originalBitmap”,而是属于“destinationBitmap”(或“cutBitmap ”)。所以这个“destRect”就有了,如果你想在所有的“destinationBitmap”里面绘制图片:

left = 0x0,top = 0x0,right = destinationBitmap.getWidth(),bottom = destinationBitmap.getHeight()。

所以使用“destinationBitmap”代替“originalBitmap”更有意义,因为“srcRect”属于“originalBitmap”大小/坐标,“destRect”属于“destinationBitmap”大小/坐标。

我的代码:

Bitmap barcodeBitmap = Bitmap.createBitmap(Math.round(Math.abs(rect.left - rect.right)), Math.round(Math.abs(rect.top - rect.bottom)), Bitmap.Config.ARGB_4444);
        Canvas cutCanvas = new Canvas(barcodeBitmap);
        Rect srcRect = new Rect(Math.round(rect.left), Math.round(rect.top), Math.round(rect.right), Math.round(rect.bottom));
        Rect destRect = new Rect(0x0, 0x0, barcodeBitmap.getWidth(), barcodeBitmap.getHeight());
        cutCanvas.drawBitmap(bitmap, srcRect, destRect, null);

(对于那些不知道的人:0x0 = 0 in hexadecimal。对于数字常量,我总是更喜欢 hex 而不是 dec。更多的 fc*ng 异国代码和更少的编译器工作(在 C/C++ 中,不要在这里用Java知道:/))

这是在“TakePictureCameraSourceCallback”内,用于在您扫描条形码后绘制一个红色矩形边界。 如果您正在构建类似的 P.M.我和我会给你所有的活动/片段代码来使用谷歌视觉获取条形码(你可以在 GitHub 中搜索它,有一个使用 CameraSource 实例来显示条形码周围的边界,直到你正在扫描它。 无论如何,我已经实现了一个 Activity,它直接返回切割的条形码位图,所以如果你不想做所有的工作,只需 pm。我不会要求 maneyz :P)

你需要的数学: 如果你有 x/y 坐标的点,你可以通过以下方式获得左点和右点之间的距离:

Dlr = sqrt(sqr(x1 - x2) + sqr(y1 - y2))

你知道 "sqrt -> Square Root" 和 "sqr -> Square" 所以 "^2" 所以 "x1 * x1"。

如果你只有 1 个坐标,比如“矩形”的工作原理,那就意味着你 有 4 个值(左、右、上、下)是线,所以要得到 左右之间的距离你需要做的绝对值 区别(顶部/底部相同,ecc):

Math.abs(左-右)

请记住,“矩形”使用“浮点”值作为坐标,所以你需要 到 "Math.round(left)" 并且可能加 1 因为 "Math.round" 会四舍五入 “

public static Bitmap cutBitmap(Bitmap originalBitmap, int srcLeft, int srcTop, int srcRight, int srcBottom)
    return cutBitmap(originalBitmap, new Rect(srcLeft, srcTop, srcRight, srcBottom));


public static Bitmap cutBitmap(Bitmap originalBitmap, Rect srcRect)
    Bitmap cutted = Bitmap.createBitmap(Math.abs(srcRect.left - srcRect.right), Math.abs(srcRect.top - srcRect.bottom), originalBitmap.getConfig());
    Canvas cutCanvas = new Canvas(cutted);
    Rect destRect = new Rect(0x0, 0x0, cutted.getWidth(), cutted.getHeight());
    cutCanvas.drawBitmap(originalBitmap, srcRect, destRect, null);
    return cutted;

这些是您可以在您的库中实现并调用以剪切您想要的图像的通用 Utils 函数。

所以上面关于条形码的代码变成了:

ImageUtils.cutBitmap(bitmap, Math.round(rect.left), Math.round(rect.top), Math.round(rect.right), Math.round(rect.bottom));

拜兹,不错的编曲 z3r0

【讨论】:

【参考方案2】:

如果我理解正确,你想画一个只有顶角是圆角的矩形吗?

您可以使用 xml 创建custom shape。

在 res/drawable 中,您将拥有一个看起来像这样的 xml(我们称之为“myCustomRect”):

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

<corners
        android:topLeftRadius="7"
        android:topRightRadius="7"
        android:bottomLeftRadius="0"
        android:bottomRightRadius="0" />
<size
        android:
        android:/>
<solid
        android:color="#000000" />

</shape>

您将在布局中指定形状:

<ImageView android:id="@+id/myId"
                    android:layout_
                    android:layout_
                    android:background="@drawable/muCustomRect"/>

我没有测试所有这些,所以你可能需要自己调试一下。

【讨论】:

顺便说一句,你很幸运我没有看到这是一个重复的线程。

以上是关于如何在 Android Canvas 中剪出一个矩形的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UIView 中剪切路径?

剪花布条

熟练linux基础命令大全

初学canvas

如何在Android中调用CustomView的onDraw(Canvas canvas)函数?

剪出一个 UIImage 以适应 UIImageView