如何在位图中转换 NV21 图像格式?
Posted
技术标签:
【中文标题】如何在位图中转换 NV21 图像格式?【英文标题】:How to convert NV21 image format in bitmap? 【发布时间】:2014-10-26 13:40:24 【问题描述】:我正在从相机获取预览数据。它是 NV21 格式。我想将预览保存到 SD 卡,即位图中。我的代码正在获取图像并保存它,但在图库中它没有被捕获预览。它只是黑色矩形,这是代码。
public void processImage()
Bitmap bitmap = null;
if (flag == true)
flag = false;
if (mCamera != null)
Camera.Parameters parameters = mCamera.getParameters();
int imageFormat = parameters.getPreviewFormat();
if (imageFormat == ImageFormat.NV21)
Toast.makeText(mContext, "Format: NV21", Toast.LENGTH_SHORT)
.show();
int w = parameters.getPreviewSize().width;
int h = parameters.getPreviewSize().height;
YuvImage yuvImage = new YuvImage(mData, imageFormat, w, h,
null);
Rect rect = new Rect(0, 0, w, h);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
yuvImage.compressToJpeg(rect, 100, baos);
byte[] jData = baos.toByteArray();
bitmap = BitmapFactory.decodeByteArray(jData, 0,
jData.length);
else if (imageFormat == ImageFormat.JPEG
|| imageFormat == ImageFormat.RGB_565)
Toast.makeText(mContext, "Format: JPEG||RGB_565",
Toast.LENGTH_SHORT).show();
bitmap = BitmapFactory.decodeByteArray(mData, 0,
mData.length);
if (bitmap != null)
saveImage(bitmap);
Toast.makeText(mContext, "Image Saved", Toast.LENGTH_SHORT)
.show();
else
Toast.makeText(mContext, "Bitmap Null", Toast.LENGTH_SHORT)
.show();
【问题讨论】:
你找到解决方案了吗? 【参考方案1】:如果您想保存 NV21 预览图像以在图库中查看,最简单的方法是从 NV21 字节数组创建一个 YuvImage,然后在文件输出流中将其压缩为 JPEG,如下面的代码:
FileOutputStream fos = new FileOutputStream(Environment.getExternalStorageDirectory() + "/imagename.jpg");
YuvImage yuvImage = new YuvImage(nv21bytearray, ImageFormat.NV21, width, height, null);
yuvImage.compressToJpeg(new Rect(0, 0, width, height), 100, fos);
fos.close();
请注意,您可能希望更改保存图像的路径。
【讨论】:
以上是关于如何在位图中转换 NV21 图像格式?的主要内容,如果未能解决你的问题,请参考以下文章
如何在位图 int 数组 (rgb565) 之间转换 UIImage
Android ImageReader 获取 NV21 格式?