使用定制相机的方形图像

Posted

技术标签:

【中文标题】使用定制相机的方形图像【英文标题】:square image using customized camera 【发布时间】:2013-12-03 13:23:29 【问题描述】:

我正在使用表面视图和自定义视图打开相机。使用它,我可以成功地使用 getSupportedPictureSizes() 中的一种尺寸单击图片。但我想要正方形的图片。现在我在点击图片后裁剪它。在 android 中可以在剩余的相机预览上显示明亮的方形图像和黑暗的覆盖,并且在点击时,只有方形内的预览被点击。这在 iPhone 中是可能的。但不知道如何在android中做到这一点。任何帮助将不胜感激。

【问题讨论】:

请在这里查看我的答案:***.com/questions/34176270/… 【参考方案1】:

是的,您可以用 2 个半透明矩形覆盖 SurfaceView 以切出正方形。

您应该计算捕获的高分辨率图像的预期裁剪效果。例如。如果您的相机支持 4368x2912 的图片尺寸,则需要裁剪 (mLeft=728, mTop=0, mWidth=2912, mHeight=2912)。

要将自定义裁剪应用于从onPictureTaken() 收到的 Jpeg byte[],您有两个选择:简单或高效。

简单的方法是将Jpeg数据解码为位图,

@Override
public void onPictureTaken(final byte[] data, Camera camera) 
    Bitmap picture = BitmapFactory.decodeByteArray(data, 0, data.length);
    picture = Bitmap.createBitmap(picture, mLeft, mTop, mWidth, mHeight);
    picture.compress(Bitmap.CompressFormat.JPEG, 85, mFileOutputStream);

缺点是它可能很慢并且需要大量内存(对于 12 MPixel 相机可能需要 60 MBytes)。

“智能”方法是使用 Jpeg 无损转换(参见例如 http://mediachest.sourceforge.net/mediautil/),使用少于 10 MBytes。请注意,这会施加一些限制,例如在上面的 12 MPixel 相机示例中,您可能需要 mLeft=720,因为 728 不能被 16 整除。

【讨论】:

预览几乎在整个屏幕上,顶部和底部都有半透明的叠加层。当我捕获图像时,我只想捕获/保存位于顶部叠加层下方和底部叠加层之上的预览部分。即没有叠加层的预览部分 @user2261466,您如何捕获图像?你想从相机中获取它,还是从画布上获取它?在前一种情况下,是否可以使用预览帧,或者您需要更高质量和可能更高分辨率但异步的takePicture()? 我需要从相机拍照(不是默认相机,而是使用surfaceview和相机实例)......这也需要更高的质量和分辨率。 要将自定义裁剪应用到从onPictureTaken() 收到的 Jpeg 字节[],您有两个选择:简单或高效。当我有一个全尺寸键盘时,我会更新我的答案。 mediachest.sourceforge.net/mediautil 可能会导致某些设备上的 exifInterface 内存不足...

以上是关于使用定制相机的方形图像的主要内容,如果未能解决你的问题,请参考以下文章

如何对相机胶卷中的照片进行方形切割?

如何方形裁剪 Flutter 相机预览

如何在android中使用相机捕获自定义图像大小?

使用 Objective C 自定义相机捕捉图像和裁剪

坏像素化图像 - 自定义 android 相机

UIImagePickerController 从相机拍照 - 默认为正方形