如何在 Android 中保存相机拍摄的图片(应用 glsl 效果)?

Posted

技术标签:

【中文标题】如何在 Android 中保存相机拍摄的图片(应用 glsl 效果)?【英文标题】:How to save picture (applied glsl effects) captured by camera in Android? 【发布时间】:2013-08-29 11:06:31 【问题描述】:

我已经通过 OpenGL ES 2.0 着色器对相机预览应用了一些效果。 接下来,我要保存这些效果图(灰度、负片...)

我在 onDrawFrame() 中调用 glReadPixels(),根据从 opengl 帧缓冲区读取的像素创建位图,然后将其保存到设备存储中。

但是,这种方式,我只是“快照”了相机效果预览。也就是说,保存的图片分辨率(例如:800*480)和Camera.PictureCallback拍摄的图片(例如:1920*1080)是不一样的。

我知道预览大小可以通过setPreviewSize()来改变,但最终不能等于图片大小。

那么,是否可以使用 glsl 着色器直接对 Camera.PictureCallback 获取的图像进行后期处理?或者还有其他方法可以实现相同的目标?

任何建议将不胜感激。 谢谢。

【问题讨论】:

我相信800×480不是相机预览大小,而是屏幕缓冲区大小 @fen:我已经将 OpenGL 效果应用于相机预览。我的问题是如何保存它。 @AlexCohn:哦?我从 getSupportedPreviewSizes() 获得了 800x480。 你在使用 setPreviewTexture() 吗? 我认为您要做的是将预览渲染到纹理或 RenderBuffer(调整大小,应用您的效果),然后使用 glReadPixels() 读取 RenderBuffer。见:processors.wiki.ti.com/index.php/… 【参考方案1】:

贾斯汀,这是我关于 setPreviewTexture() 的问题,而不是建议。如果你发送从 onPreviewFrame() 回调接收到的像素数据,它自然会受到支持的预览大小的限制。

您可以使用相同的逻辑将像素从 onPictureTaken() 推送到纹理,但您应该将它们从 JPEG 格式解码为 RGB。

【讨论】:

以上是关于如何在 Android 中保存相机拍摄的图片(应用 glsl 效果)?的主要内容,如果未能解决你的问题,请参考以下文章

Android将图片旋转90度(由相机拍摄)[重复]

Android:保存用户使用相机拍摄的照片

Android 使用系统相机拍摄照片保存到本地并在系统相册中显示

如何在android中保存从相机拍摄的图像

如何在 Android 中使用自定义文件名保存相机拍摄的图像?

避免图库保存在Android中使用相机拍摄的照片