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;
}

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • BAT机器学习面试1000题系列(详细版)

    BAT机器学习面试1000题系列(详细版)BAT机器学习面试1000题系列置顶2017年12月14日15:19:15阅读数:20913几点声明:1、本文的内容全部来源于七月在线发布的BAT机器学习面试1000题系列;2、文章中带斜体的文字代表是本人自己增加的内容,如有错误还请批评指正;3、原文中有部分链接已经失效,故而本人重新加上了新的链接,如有不当,还请指正。(也已用斜体标出)4、部分答案由于完全是摘抄自其它的博客,所以本人就只贴出答…

    2022年5月23日
    41
  • 数字电路实验(01)基本逻辑运算及其电路实现

    数字电路实验(01)基本逻辑运算及其电路实现题目实验要求一、实验目的1.认识逻辑值1、0和逻辑门的输入、输出信号电平之间的关系;2.从逻辑门的输入、输出电平的关系去认识逻辑与(与非)、或、非的运算;3.熟悉基本逻辑门的使用。二、实验

    2022年6月30日
    27
  • git查看当前分支所属

    git查看当前分支所属

    2021年10月22日
    57
  • java输入数组元素_java数组的输出

    java输入数组元素_java数组的输出1.简介Java中快捷输出数组中各个元素笔者目前所知的就三种方法,今天就简单的做个记录。大家如果有什么更好的方法,麻烦留言评论。2.代码publicclassArrayPrint{publicstaticvoidmain(String[]args){int[]arrays1=newint[]{1,2,3,4};//ThefirstmethodSystem.out…

    2022年8月31日
    3
  • tabnine激活(JetBrains全家桶)「建议收藏」

    (tabnine激活)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html4M7HSKPBXS-eyJsaWN…

    2022年3月29日
    542
  • Java Eclipse自动补全设置[通俗易懂]

    Java Eclipse自动补全设置[通俗易懂]Eclipse代码自动补全功能默认只包括点”.” ,即只有输入”.”后才出现自动补全的提示框。想要自动补全总是去按“Alt+/”也很麻烦。其实只需简单在Eclipse中进行设置即可实现输入任意及符合自动出现自动补全提示框。具体设置步骤如下:   选择Eclipse菜单条中的Windows菜单下的Preferences项。在左侧找到“Java”=》“Editor”=》

    2022年6月28日
    23

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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