图片错误无法打开
protected void onPictureData(byte[] data, int format, int width, int height, int orientation, boolean isBGImage) {
mHeight = height;
mWidth = width;
Log.d(TAG,"mHeight = " + mHeight + " mWidth = " + mWidth);
if (mAddedFrames == 3){
mAddedFrames = 0;
mAddedFrames++;
num = mAddedFrames;
}else {
mAddedFrames++;
num = mAddedFrames;
}
captureYuv = YuvEncodeJni.getInstance().Jpeg2Nv21(data, mWidth,mHeight, 1, 0, false);
// addData(data, captureYuv, num);
onJpeg(captureYuv,true);
}
onPictureData接口返回的是JPEG数据,通过YuvEncodeJni转为了captureYuv(yuv数据),然后直接调用onJpeg方法,用JPEG方法保存YUV,图库无法显示,用yuvviewer查看显示没有符合图片,因为存为了JPEG格式图片,但是数据内容是YUV,所以yuvviewer无法识别,我们也不能查看图片内容
条纹问题
public int getJpegOrientation() {
Log.d(TAG,"mJpegOrientation = " + mJpegOrientation);
return mJpegOrientation;
}
先讲一下拍照角度,手机竖着放是0,摄像头的角度与手机屏呈90度夹角,后摄屏幕角度是0度,摄像头后摄竖排是90度,后摄顺时针转90度转,变为横排摄像头:180度;后摄逆时针转90度变为横排:摄像头角度0度;前摄竖排270度,前摄顺时针转90度横拍:180度;前摄逆时针转90度横排:0度。下发拍照有一个 JPEG_Orienetation的变化,如果没有人为适配角度变化,则底层会有一个默认角度0。然后JPEG_Orienetation影响的是成像的角度旋转,那么怎么才会出现这种情况,就是通过JPEG_Orienetation角度来影响成像的尺寸
result = YuvEncodeJni.getInstance().EncodeYuvToJpeg(result, ImageFormat.NV21,
mWidth, mHeight, 95, 0);
onJpeg(result,true);
在JPEG转YUV时,需要正确的宽和高,如果角度不对,比如像上图竖着拍的,分辨率是3264x2448,但实际成像却是横着拍的处理结果。竖着的长方形在图库中的成像是一个横着的长方形,这样错误的处理结果原因是上面转换的mWidth和mHeight错误导致,如果把 mWidth, mHeight互换则理论上可以成像,但由于EncodeYuvToJpeg的方法参数是native方法,所以与实际效果有所差异。
综上JPEG_Orienetation会影响JPEG转换为YUV的尺寸,实际的尺寸与想要处理的尺寸通过JPEG_Orienetation发生改变,就会出现各种图像错误,90度的错误处理是上图,那么完全错误的尺寸处理就会产生下面情况
马赛克条纹
result = YuvEncodeJni.getInstance().EncodeYuvToJpeg(result, ImageFormat.NV21,
1000, 1000, 95, 0);//尺寸不对就会拉伸
onJpeg(result,true);
JPEG随意的尺寸转换为YUV,图像完全错误
绿屏
下发拍照的照片imageReader的尺寸和底层返回的尺寸是一致的,如果图像解析处理的imageReader尺寸和不一致,比如该设备支持的后摄分辨率是3120x4160,但是处理算法处理尺寸为3264x2448,就会出现绿屏
错误结合:
绿屏加上JPEG转YUV尺寸错误:
绿色条纹