【问题标题】:Crop and keep the size of an image android裁剪并保持图像的大小 android
【发布时间】:2011-01-28 14:14:10
【问题描述】:

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

所以整个图像被裁剪到中间的正方形,但没有在屏幕上拉伸并保持在中心,所以基本上删除了图像的无意义部分,但保持像素的坐标一样。

【问题讨论】:

  • 我认为您要描述的内容称为感兴趣区域 (ROI)。这可能会帮助您在 Google 上找到一些答案。

标签: java android image-processing android-image


【解决方案1】:

假设您已完成人脸检测,并在图像中找到了一张人脸。您的图像为 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);

【讨论】:

    【解决方案2】:

    如果我了解您并不是真的想裁剪图像而是“隐藏”正方形周围的任何像素。

    有很多方法可以做到这一点,具体取决于您要执行的操作。例如,您可以将图片中不感兴趣的部分填充为黑色或使其透明。

    这样,“裁剪”图片的坐标在屏幕上将保持不变。

    【讨论】:

    • 创建一个与原始大小相同的新黑色图像,并将感兴趣区域复制到与原始图像相同 x/y/width/height 的新图像可能也更容易。
    • 问题是我不仅需要隐藏像素,还需要摆脱它们。我需要将图像保持为位图格式,但尽量减小图像的大小,以便检测人脸。通过将像素更改为黑色,它仍会存储该像素,因此不会丢失文件大小。
    • 好吧,也许这就是你想要做的:首先存储正方形的左上角坐标,然后裁剪它。接下来清除您的绘图区域并使用 canvas.drawBitmap(bitmap, left, top, paint) 其中 left 和 top 是您存储的坐标。
    【解决方案3】:

    如果 all 您感兴趣的是图像的中心,那么一种非常简单的方法就是将 android:scaleType="center" 属性添加到您的 ImageView,然后设置ImageView 到你想要的裁剪大小。但是,如果您希望它是可定位的,那就另当别论了。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-01
      • 2014-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      相关资源
      最近更新 更多