我使用libyuv将NV21图像格式转换为I420:
void convert(uint8* input, int width, int height) {
int size = width * height * 3/2;
uint8* output = new uint8[size];
uint8* src_y = input;
int src_stride_y = width;
uint8* src_vu = input + (width * height);
int src_stride_vu = width / 2;
uint8* dst_y = output;
int dst_stride_y = width;
uint8* dst_u = dst_y + (width * height);
int dst_stride_u = width / 2;
uint8* dst_v = dst_u + (width * height) / 4;
int dst_stride_v = width / 2;
libyuv::NV21ToI420(src_y, src_stride_y,
src_vu, src_stride_vu,
dst_y, dst_stride_y,
dst_u, dst_stride_u,
dst_v, dst_stride_v,
width, height);
dumpToFile(dst_y, size);
...
}
输入的大小为640x480。
我使用ImageMagick的显示器显示转储文件:
$ display -size 640x480 -depth 8 -sampling-factor 4:2:0 -colorspace srgb MyI420_1.yuv
然而,颜色在显示的图像中混乱。图像的其他方面看起来还不错。
我想知道我的代码是否犯了错误。也许我的步幅计算不正确。
请注意,如果我使用自定义功能重新排列V1U1V2U2 ...作为U1U2 ... V1V2 ...并转储输出,它显示正常。但是,我更喜欢使用libyuv,因为它对neon,SSE2等有一些优化。问候。
答案 0 :(得分:0)
您的 src_stride_vu
需要与 width
相同,因为它的组合步幅为 UV 像素交错。