我碰到过, 这个是原生方案采用的参数不恰当导致的。
全景图像数据的处理是使用OpenGL 处理的, 你可以看下 Camea apk的 jni部分的源码, 找到文件:
jni/feature_mos/src/mosaic_renderer/YVURenderer.cpp找到 成员函数 FragmentShaderSource()的定义, 该函数内部采用的从 RGBA 格式转YUV格式的矩阵参数选择不恰当, 如果你对相关 知识熟悉的话, 应该知道是有两组可选参数的, 分别用在静态图像和动态视频中。相关转换知识请参考: http://www.fourcc.org/fccyvrgb.php第一组:
Y  =      (0.257 * R) + (0.504 * G) + (0.098 * B) + 16Cr = V =  (0.439 * R) - (0.368 * G) - (0.071 * B) + 128Cb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128这是原生 camera 采用的这一种, 是不恰当的, 而且存在错误, 请看如下实际代码:
"const vec4 coeff_y = vec4(0.257, 0.594, 0.098, 0.063);\n"
 "const vec4 coeff_v = vec4(0.439, -0.368, -0.071, 0.500);\n"
 "const vec4 coeff_u = vec4(-0.148, -0.291, 0.439, 0.500);\n"请看每一个向量定义中最后一维的值, 如果RGBA中alpha分量不为255, 必然导致 转换公式中最后的常量部分值不对, 这是错误, 既然是常量, 就不应该收alpha分量影响。第二组:
y  = 0.299R+0.587G+0.114B
cr =  0.500R-0.419G-0.081B
cb =  -0.169R-0.331G+0.500B这个是修正方案, 你可以采用这个; 不过需要注意, 这个转换公式不带常数, 因此转换矩阵的最后一维都设为0即可。修改后:
 "const vec4 coeff_y = vec4(0.299, 0.587, 0.114, 0.0);\n"
 "const vec4 coeff_v = vec4(0.500, -0.419, -0.081, 0.0);\n"
 "const vec4 coeff_u = vec4(-0.169, -0.331, 0.500, 0.0);\n"你可以试一下。