这是一个很难用语言解释的问题(无论如何对我来说都是如此)。我需要能够拍摄图像(位图)并将图像裁剪到屏幕中心的特定大小,但保持图像大小相同。希望下面的图片可以解释我的意思:
所以整个图像被裁剪到中间的正方形,但没有在屏幕上拉伸并保持在中心,所以基本上删除了图像的无意义部分,但保持像素坐标相同。
这是一个很难用语言解释的问题(无论如何对我来说都是如此)。我需要能够拍摄图像(位图)并将图像裁剪到屏幕中心的特定大小,但保持图像大小相同。希望下面的图片可以解释我的意思:
所以整个图像被裁剪到中间的正方形,但没有在屏幕上拉伸并保持在中心,所以基本上删除了图像的无意义部分,但保持像素坐标相同。
因此,假设您已经完成了人脸检测,并在图像中找到了一张人脸。您的图像为 320 x 240,脸部由位置为 100,40 且宽度为 20 x 30 的矩形包围。现在您想如何处理这些信息?我会尽力提供帮助,但您可能需要澄清我的任何错误假设。
首先,您可以使用Bitmap.createBitmap()之类的方法抓取面部并将其存储到新的位图中:
Bitmap face = Bitmap.createBitmap(largeSource, 100, 40, 20, 30);
这应该在绘图循环之外完成,例如在 onCreate 或其他一些初始化步骤中。
听起来您有一些容器(ImageView?带有覆盖 onDraw 的自定义视图?),其中包含您的大图像。现在您只想在该容器中的原始位置绘制脸部?如果你有一个自定义视图,那么在你的 onDraw 中就像下面这样简单:
canvas.drawBitmap(face, 100, 40, facePaint);
如果您改用 ImageView,我建议您改用自定义绘制的视图,因为听起来您需要一些细粒度的绘图控件。
最后,如果你有一堆这样的面孔,创建一个新的 FaceObj POJO 对象,它只有一个位图、x 和 y 坐标。当你检测到人脸时,将它们添加到一个 ArrayList 中,然后在你的 onDraw 中迭代它来绘制你所有的人脸:
faces.add(new FaceObj(Bitmap.createBitmap(largeSource, 100, 40, 20, 30), 100, 40);
...
foreach(FaceObj f : faces)
canvas.drawBitmap(f.bitmap, f.x, f.y, facePaint);
如果我了解您并不是真的想裁剪图像,而是“隐藏”正方形周围的任何像素。
有很多方法可以做到这一点,具体取决于您要执行的操作。例如,您可以用黑色填充图片中不感兴趣的部分或使其透明。
这样,“裁剪”图片的坐标在屏幕上将保持不变。
如果您只对图像的中心感兴趣,那么一种非常简单的方法就是将 android:scaleType="center" 属性添加到您的 ImageView,并将 ImageView 设置为您想要的裁剪大小。但是,如果您希望它是可定位的,那就另当别论了。
使用Canvas.drawBitmap()
您可能能够将图像的一部分复制到不同的位图,并丢弃其他位图。使用此特定版本的方法,您可以发送使用 获得的颜色数组getPixels()
,并设置偏移量以及要复制的宽度和高度。该stride
参数很重要,因为它需要设置为原始图像的宽度,即使您的最终图像会更小,因为它会从原始图像中提取像素。