4.OSD叠加学习之左右与上下拼接

该博客介绍了如何实现YUV图片的左右和上下拼接。代码分别展示了两个函数,`LUX_YUV_ColorSplice`用于左右拼接,`LUX_YUV_ColorSpliceUpDowm`用于上下拼接。通过内存拷贝将两幅图片的数据整合到新的YUV缓冲区中,然后创建输出文件。这个过程适用于视频处理和图像编辑场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最终实现图:

左右拼接
在这里插入图片描述
上下拼接
在这里插入图片描述

实现思路:

这左右上下拼接思路与前面的横向纵向显示 思路差不多 ,甚至更简单就不多说了(不了解请移步)。

代码编写

/*图片左右拼接*/
int LUX_YUV_ColorSplice(char *file1,char *file2)
{   
    int Ret                 = 0;
    int height              = 0;
    int yuvSize             = LUX_Y_ALL_SIZE * 3;
    const int yAddSize      = 1920;
    const int uvAddSize     = 960;
    const int yAllSize      = 1080*3840;
    const int yWidthSize    = 3840;
    const int uvWidthSize   = 1920;

    char *pOneFileData      = NULL;
    char *ptwoFileData      = NULL;
    char *pOverFileData     = NULL;

    pOneFileData            =(char *)malloc(LUX_Y_ALL_SIZE*3/2);
    ptwoFileData            =(char *)malloc(LUX_Y_ALL_SIZE*3/2);
    pOverFileData           =(char *)malloc(LUX_Y_ALL_SIZE*3);


    Ret = LUX_Open_file(pOneFileData,file1);
    if (-1 == Ret)
    {
        printf("LUX_Open_one_file fail\n"); 
        return -1;  
    }
   
    Ret = LUX_Open_file(ptwoFileData,file2);
    if (-1 == Ret)
    {
        printf("LUX_Open_two_file fail\n"); 
        return -2;  
    }

    for (height = 0;height < 1080;height++)
    {
       
        memcpy(pOverFileData + (height*yWidthSize) ,pOneFileData + height*yAddSize ,yAddSize);
        memcpy(pOverFileData + yAddSize + (height*yWidthSize) ,ptwoFileData+height*yAddSize ,yAddSize);

        memcpy(pOverFileData + yAllSize + height*uvWidthSize ,
                pOneFileData + LUX_Y_ALL_SIZE + height*uvAddSize ,uvAddSize);
        memcpy(pOverFileData + yAllSize + uvAddSize + height*uvWidthSize ,
                ptwoFileData + LUX_Y_ALL_SIZE + height*uvAddSize ,uvAddSize);
    }

    Ret = LUX_file_make(yuvSize,pOverFileData,LUX_YUV_File_Name_Splice);
    if(-1 == Ret)
    {
        printf("LUX_file_make fail");
        return -2;
    }
    
    free(pOneFileData);
    free(ptwoFileData);
    free(pOverFileData);
    return 0;
} 
/*图片上下拼接*/
int LUX_YUV_ColorSpliceUpDowm(char *file1,char *file2)
{   
    int Ret                 = 0;
    int height              = 0;
    int yuvSize             = 2160*1920*3;
    int pictureNum          = 0;

    const int yAllSize      = 2160*1920;
    const int uAllSize      = 540*960;
    const int vAllSize      = 540*960;
    const int yuAllSize     = 2160*1920*5/4;


    char *pOneFileData      = NULL;
    char *ptwoFileData      = NULL;
    char *pOverFileData     = NULL;

    pOneFileData            =(char *)malloc(LUX_Y_ALL_SIZE*3/2);
    ptwoFileData            =(char *)malloc(LUX_Y_ALL_SIZE*3/2);
    pOverFileData           =(char *)malloc(LUX_Y_ALL_SIZE*3);


    Ret = LUX_Open_file(pOneFileData,file1);
    if (-1 == Ret)
    {
        printf("LUX_Open_one_file fail\n"); 
        return -1;  
    }
   
    Ret = LUX_Open_file(ptwoFileData,file2);
    if (-1 == Ret)
    {
        printf("LUX_Open_two_file fail\n"); 
        return -2;  
    }

    /*画第一张图*/
    memcpy(pOverFileData ,pOneFileData ,LUX_Y_ALL_SIZE);
    memcpy(pOverFileData + yAllSize ,pOneFileData + LUX_Y_ALL_SIZE ,uAllSize);
    memcpy(pOverFileData + yuAllSize ,pOneFileData + LUX_YU_ALL_SIZE ,vAllSize);
    /*画第二张图*/
    memcpy(pOverFileData + LUX_Y_ALL_SIZE,ptwoFileData ,LUX_Y_ALL_SIZE);
    memcpy(pOverFileData + yAllSize + uAllSize,ptwoFileData + LUX_Y_ALL_SIZE ,uAllSize);
    memcpy(pOverFileData + yuAllSize + vAllSize,ptwoFileData + LUX_YU_ALL_SIZE ,vAllSize);

    Ret = LUX_file_make(yuvSize,pOverFileData,LUX_YUV_File_Name_point);
    if(-1 == Ret)
    {
        printf("LUX_file_make fail");
        return -2;
    }
    
    free(pOneFileData);
    free(ptwoFileData);
    free(pOverFileData);
    return 0;
}

注:整个工程在最后一起上传。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值