图片问题处理

博客探讨了在图像处理中遇到的常见问题,包括图片无法打开的条纹问题、JPEG转YUV时的尺寸错误导致的马赛克条纹以及绿屏错误。问题源于JPEG_Orientation的不正确处理,转换过程中的宽高使用不当,以及图像尺寸与处理算法不匹配。解决办法涉及正确适配角度变化,确保转换时的宽高对应,并保持图像处理尺寸与设备支持的尺寸一致。
摘要由CSDN通过智能技术生成

图片错误无法打开

在这里插入图片描述

     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尺寸错误:
在这里插入图片描述
绿色条纹

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值