这是一个非常难以用语言解释的问题(无论如何它对我来说都是如此)。我需要能够拍摄图像(位图)并将图像裁剪到屏幕中心的特定尺寸,但保持图像的大小相同。希望下面的图片可以解释我的意思:
因此整个图像被裁剪到中间的正方形,但没有在屏幕上拉伸并保持在中心,所以基本上删除图像的无意义部分但保持像素的坐标相同。
答案 0 :(得分:3)
因此,假设您已完成脸部检测,并在图像中找到了一张脸。你的图像是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);
答案 1 :(得分:0)
如果我了解你真的不想剪裁你的图像,而是“隐藏”广场周围的任何像素。
根据您的目的,有很多方法可以做到这一点。例如,您可以用黑色填充图片中不感兴趣的部分或使其透明。
这样,“裁剪”图片的坐标在屏幕上保持不变。
答案 2 :(得分:0)
如果您感兴趣的 all 是图像的中心,那么一个非常简单的方法就是将android:scaleType =“center”属性添加到ImageView中,然后设置ImageView到您想要的裁剪尺寸。但是,如果你想让它成为可定位的,那就是另一回事了。
使用Canvas.drawBitmap()
您可能能够将图像的一部分复制到不同的位图,并丢弃另一个位图。使用此特定版本的方法,您可以使用getPixels()
发送颜色数组,并设置偏移量以及要复制的宽度和高度。 stride
参数很重要,因为它需要设置为原始图像的宽度,即使最终图像较小,因为它会从原始图像中提取像素。