两张yuv图片叠加

程序实现将一个400x400的yuv420p小图,覆盖在一张640x480的yuv420p大图上

#include <stdio.h>
#include <stdint.h>
#include <cstring>

int main(int argc, char **argv){
    int sw = 400, sh=400;
    int bw = 640, bh = 480;
    FILE* fp1 = NULL;
    fopen_s(&fp1,"400x400.yuv","rb");
    FILE* fp2 = NULL;
    fopen_s(&fp2, "640x480.yuv", "rb");
    char* yuv1 = new char[sw*sh*3/2];
    char* yuv2 = new char[bw*bh*3/2];

    fread(yuv1, sw * sh * 3/2,1,fp1);
    fread(yuv2, bw * bh * 3/2, 1, fp2);

    char* y1 = yuv1;
    char* u1 = y1 + sw * sh;
    char* v1 = u1 + sw * sh / 4;

    char* y2 = yuv2;
    char* u2 = y2 + bw*bh;
    char* v2 = u2 + bw * bh / 4;

    //从图像左上角开始进行yuv覆盖
    for (int i = 0; i < sh; i++){ //每次循环一次,扫描一行数据

        memcpy(y2, y1, sw); //y值覆盖
        memcpy(u2, u1, sw / 2); //注意:根据采样比例,每一行的Y是每一行的U的两倍
        memcpy(v2, v1, sw/2);

        //换行,指针偏移到行首
        y2 += bw;
        u2 += bw/2;
        v2 += bw/2;

        y1 += sw;
        u1 += sw / 2;
        v1 += sw / 2;

    }

    FILE* fpout = NULL;
    fopen_s(&fpout, "mux_out.yuv", "wb");
    fwrite(yuv2, bw * bh * 3/2,1 ,fpout);

    fclose(fpout);
    fclose(fp1);
    fclose(fp2);
    delete[] yuv1;
    delete[] yuv2;
    return 0;

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要获取一张yuv420图片的数据,可以使用libjpeg-turbo提供的API函数进行操作。以下是获取yuv420图片数据的基本步骤: 1. 打开yuv420图片文件并读取数据,可以使用标准的文件操作函数(例如fopen、fread等)。 2. 创建libjpeg-turbo解码器对象,可以使用tjInitDecompress函数。此函数返回一个指向解码器对象的指针。 3. 将yuv420图片数据解码为RGB格式,可以使用tjDecodeYUV函数。此函数将yuv420数据转换为RGB数据,并将转换后的数据存储在一个指定的缓冲区中。 4. 关闭解码器对象,可以使用tjDestroy函数。此函数释放解码器对象占用的内存。 以下是一个获取yuv420图片数据的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <turbojpeg.h> int main(int argc, char **argv) { int width, height, subsample, colorspace; unsigned char *rgb_buffer = NULL; FILE *f = NULL; tjhandle handle = NULL; // 打开yuv420图片文件并读取数据 f = fopen("test.yuv", "rb"); if (f == NULL) { printf("Error: failed to open file\n"); return -1; } fseek(f, 0, SEEK_END); long file_size = ftell(f); fseek(f, 0, SEEK_SET); unsigned char *yuv_buffer = (unsigned char *)malloc(file_size); fread(yuv_buffer, file_size, 1, f); fclose(f); // 创建解码器对象 handle = tjInitDecompress(); if (handle == NULL) { printf("Error: failed to create decompressor\n"); goto fail; } // 获取图片信息 if (tjDecompressHeader3(handle, yuv_buffer, file_size, &width, &height, &subsample, &colorspace) != 0) { printf("Error: failed to get image info\n"); goto fail; } // 分配RGB缓冲区 rgb_buffer = (unsigned char *)malloc(width * height * TJPF_RGB); if (rgb_buffer == NULL) { printf("Error: failed to allocate RGB buffer\n"); goto fail; } // 将yuv420数据解码为RGB数据 if (tjDecodeYUV(handle, yuv_buffer, file_size, subsample, rgb_buffer, width, 0, height, TJPF_RGB, TJFLAG_FASTDCT) != 0) { printf("Error: failed to decode image\n"); goto fail; } // 关闭解码器对象 tjDestroy(handle); // 在这里处理RGB数据 // 释放内存 free(yuv_buffer); free(rgb_buffer); return 0; fail: if (handle != NULL) { tjDestroy(handle); } if (yuv_buffer != NULL) { free(yuv_buffer); } if (rgb_buffer != NULL) { free(rgb_buffer); } return -1; } ``` 在上面的示例代码中,我们首先打开yuv420图片文件并读取数据,然后创建libjpeg-turbo解码器对象。接下来,我们使用tjDecompressHeader3函数获取图片信息,并分配RGB缓冲区。最后,我们使用tjDecodeYUV函数将yuv420数据解码为RGB数据,并将其存储在RGB缓冲区中。在解码完成后,我们关闭解码器对象,并释放占用的内存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值