繁体   English   中英

裁剪并保持图像android的大小

[英]Crop and keep the size of an image android

这是一个很难用言语解释的问题(无论如何对我来说)。 我需要能够拍摄图像(位图)并将图像裁剪到屏幕中央的特定大小,但图像的大小必须保持不变。 希望下面的图片可以解释我的意思:

在此处输入图片说明

因此,整个图像在中央被裁切成正方形,但没有在屏幕上延伸并保持在中心,因此基本上删除了图像的毫无意义的部分,但保持了像素坐标不变。

假设您已经完成了人脸检测,并在图像中找到了一张人脸。 您的图像为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 =“中心”属性到您的ImageView,并设置ImageView的到你想要的裁剪尺寸。 但是,如果您希望它可定位,那就另当别论了。

使用Canvas.drawBitmap()您可能能够将图像的一部分复制到其他位图,并丢弃其他位图。 使用此方法的特定版本,您可以发送通过getPixels()获得的颜色数组,并设置偏移量以及要复制的宽度和高度。 不过, stride参数很重要,因为即使最终图像会更小,也需要将其设置为原始图像的宽度,因为它会从原始图像中拉出像素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM