jpg转nv12_jpeg改jpg

jpg转nv12_jpeg改jpg代码主要用到了libyuv库和libjpeg库。编译:g++demo.cpp-lyuv-ljpeg-odemoubuntu下测试(需安装ffmpeg,width以及height按实际情况填写):ffplay-itest.yuv-pixel_formatnv12-swidthxheightdemo:#include<stdio.h>#include<stdlib.h>#include<libyuv.h>#..

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

代码主要用到了libyuv库和libjpeg库。

编译:

g++ demo.cpp -lyuv -ljpeg -o demo

ubuntu下测试(需安装ffmpeg,width以及height按实际情况填写): 

ffplay -i test.yuv -pixel_format nv12 -video_size widthxheight

demo: 

#include <stdio.h>
#include <stdlib.h>
#include <libyuv.h>

#define align_buffer_page_end(var, size)                                    \
    uint8_t* var##_mem =                                                    \
        reinterpret_cast<uint8_t*>(malloc(((size) + 4095 + 63) & ~4095));   \
    uint8_t* var = reinterpret_cast<uint8_t*>(                              \
        (intptr_t)(var##_mem + (((size) + 4095 + 63) & ~4095) - (size)) & ~63)

#define free_aligned_buffer_page_end(var)   \
    free(var##_mem);                        \
    var = 0

using namespace libyuv;

int main(int argc, char *argv[])
{
    int32_t width = 0, height = 0;

    FILE *dst;
    FILE *ori = fopen("test.jpg", "rb+");
    fseek(ori, 0, SEEK_END);
    uint32_t data_size = ftell(ori);
    fseek(ori, 0, SEEK_SET);
    uint8_t *data = (uint8_t *)calloc(1, data_size);
    fread(data, data_size, 1, ori);
    fclose(ori);

    int32_t ret = MJPGSize(data, data_size, &width, &height);
    int32_t half_width = (width + 1) / 2;
    int32_t half_height = (height + 1) / 2;

    align_buffer_page_end(dst_y, width * height);
    align_buffer_page_end(dst_uv, half_width * half_height * 2);

    ret = MJPGToNV12(data, data_size, dst_y, width, dst_uv, half_width * 2, width, height, width, height);
    if (0 == ret) {
        printf("change to nv12 success\n");
    } else {
        printf("change to nv12 failed\n");
        goto errChange;
    }

    dst = fopen("test.yuv", "wb+");
    fwrite(dst_y, width * height, 1, dst);
    fwrite(dst_uv, half_width * half_height * 2, 1, dst);
    fclose(dst);

errChange:
    free(data);
    free_aligned_buffer_page_end(dst_y);
    free_aligned_buffer_page_end(dst_uv);

    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/192969.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 居民身份证号码组成规则

    居民身份证号码组成规则第一、二位表示省(自治区、直辖市、特别行政区)。第三、四位表示市(地级市、自治州、地区、盟及直辖市所属区和县的汇总码)。其中,01-20,51-70表示地级市;21-50表示地区(自治州、盟)。第

  • 先学java再学python_java和python应该先学好哪个呢

    先学java再学python_java和python应该先学好哪个呢java和python应该先学好哪个呢发布时间:2020-07-3011:21:41来源:亿速云阅读:82作者:清晨不懂java和python应该先学好哪个呢?其实想解决这个问题也不难,下面让小编带着大家一起学习怎么去解决,希望大家阅读完这篇文章后大所收获。作为一名Java程序员,肯定会建议你先学Java,然后再学Python,但如果你问一个Python程序员,可能会得到一个完全相反…

  • 超声波雷达介绍及车位探测信号处理方法「建议收藏」

    超声波雷达介绍及车位探测信号处理方法「建议收藏」1、超声波雷达介绍超声波雷达的工作原理是通过超声波发射装置向外发出超声波,到通过接收器接收到发送过来超声波时的时间差来测算距离。特性一:温度敏感特性二:无法精确描述障碍物位置(接收到的只是距离,并不知道具体方向)雷达探测范围数字模型:参数α:超声波雷达的探测角参数β:检测宽度范围影响因素之一,UPA的β角为20°左右,APA的β角比较特殊,为0…

  • mysql 截取字符串部分值_mysql截取字符串取值

    mysql 截取字符串部分值_mysql截取字符串取值使用mysql过程中根据实际业务的开发需求和表的设计有时候我们需要在sql中根据某个字符串截取并且取值:demo如下:ifnull(max(SUBSTRING_INDEX(c.check_score,’,’,-1)),’-‘)swjdf//按照,截取check_score这个字段的值,-1取的是倒数第一位即最后一位SUBSTRING_INDEX函数语法:SUBSTRING_INDEX(str…

  • 装饰者设计模式(java版本)

    装饰者设计模式(java版本)

  • linux创建新的用户组_linux创建用户并指定用户组

    linux创建新的用户组_linux创建用户并指定用户组https://blog.csdn.net/yuanyuan214365/article/details/751539281、添加用户,首先用adduser命令添加一个普通用户,命令如下:#addusertommy//添加一个名为tommy的用户#passwdtommy//修改密码Changingpasswordforusertommy.NewUNIX…

    2022年10月26日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号