关于android的YuvImage旋转

编程入门 行业动态 更新时间:2024-10-09 16:27:17

关于<a href=https://www.elefans.com/category/jswz/34/1771384.html style=android的YuvImage旋转"/>

关于android的YuvImage旋转

YuvImage 在安卓中不常用,远远没有Bitmap那么常见。


我搞了那么久安卓开发,因为之前没有接触相机相关的开发,所以这个YuvImage还是第一次碰到。


其中是在Camera类的的PreviewCallback回调中



这个接口回调的是相机的预览图像,但是是YUV格式的,起初我想吧这个byte数组转换成bitmap,用BitmapFactory转后拿到null的对象

显然,这个byte数组不一样。


然后我利用YuvImage对象的compressToJpeg方法生成图片文件保存在本地,算是看清了图片的内容


YuvImage对象内部的方法少的可怜,感觉只能单方向的转成文件流,然后文件再转成bitmap。要是从bitmap回到YuvImage感觉不太可能。(知道的大神可以说下)


贴上YuvImage格式byte数组转成文件的办法:


public static void saveMyBitmap(String filePath,byte[] data,int width,int high){File f = new File(filePath);try {f.createNewFile();} catch (IOException e) {}FileOutputStream fOut = null;try {fOut = new FileOutputStream(f);} catch (FileNotFoundException e) {e.printStackTrace();}int w = cameraManager.getPreviewWidth();int h = cameraManager.getPreviewHeight();YuvImage yuvImage = new YuvImage(data,ImageFormat.NV21,<span style="font-family: Arial, Helvetica, sans-serif;">width</span><span style="font-family: Arial, Helvetica, sans-serif;">,high,null);</span>try {yuvImagepressToJpeg(new Rect(0,0,w,h),50,fOut);}catch (Exception e){}try {fOut.flush();} catch (IOException e) {e.printStackTrace();}try {fOut.close();} catch (IOException e) {e.printStackTrace();}}

再提及一下,为什么要旋转YuvImage,因为安卓的摄像Camera天生是横的,当用竖屏牌照或者摄像的时候,需要设置

Camera.setDisplayOrientation(90);

这样,照片的方向是对的,但是尺寸缺不对劲,这时,surfaceView的宽高比和Camera的宽高比刚好是倒数关系,预览图的输出倒了,相机还是原来的,这个貌似无法改变。就此时你拍摄一张照片,拿到的bitmap也是有90度的角度差别和你竖屏所见。后续处理bitmap旋转并不麻烦:

 

@Override  
public void onPictureTaken(byte[] data, Camera camera) {  //将得到的照片进行270°旋转,使其竖直  Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);  Matrix matrix = new Matrix();  matrix.preRotate(270);  bitmap = Bitmap.createBitmap(bitmap ,0,0, bitmap .getWidth(), bitmap
.getHeight(),matrix,true);  
};


但是处理YuvImage旋转就蛋疼了,我找了很久发现没有找到。准备放弃的时候去stackoverflow看了一下问题和我类似:



贴上旋转YuvImage的核心代码,谢谢大神:


private byte[] rotateYUV420Degree90(byte[] data, int imageWidth, int imageHeight){byte [] yuv = new byte[imageWidth*imageHeight*3/2];// Rotate the Y lumaint i = 0;for(int x = 0;x < imageWidth;x++){for(int y = imageHeight-1;y >= 0;y--){yuv[i] = data[y*imageWidth+x];i++;}}// Rotate the U and V color componentsi = imageWidth*imageHeight*3/2-1;for(int x = imageWidth-1;x > 0;x=x-2){for(int y = 0;y < imageHeight/2;y++){yuv[i] = data[(imageWidth*imageHeight)+(y*imageWidth)+x];i--;yuv[i] = data[(imageWidth*imageHeight)+(y*imageWidth)+(x-1)];i--;}}return yuv;}

亲测有效,转完还是YuvImage格式的byte数组,屌炸了


以上,转载请注明出处:


更多推荐

关于android的YuvImage旋转

本文发布于:2024-02-13 16:12:03,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1759097.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:android   YuvImage

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!