首页 > 其他分享 >nvjpeg 简单使用

nvjpeg 简单使用

时间:2022-09-21 10:45:44浏览次数:87  
标签:ev image 简单 encoder nvjpeg 使用 input NULL

nvjpeg是英伟达提供的一个可以将显存中的数据直接压缩成jpg图片的sdk,包含在cuda套件中。

官方接口文档 https://docs.nvidia.com/cuda/nvjpeg/index.html#nvjpeg-encode-image

一个写得挺好的博客 nvJPEG压缩图像, 本文代码基本来自该博客。

代码:

#include <nvjpeg.h>

#include <fstream>
#include <vector>
#include <iostream>



int saveJpeg(const char * filepath, unsigned char* d_srcBGR, int width, int height)
{
    nvjpegHandle_t nvjpeg_handle;
    nvjpegEncoderState_t encoder_state;
    nvjpegEncoderParams_t encoder_params;

    cudaEvent_t ev_start, ev_end;
    cudaEventCreate(&ev_start);
    cudaEventCreate(&ev_end);
    

    nvjpegImage_t input;
    nvjpegInputFormat_t input_format = NVJPEG_INPUT_BGRI;
    int image_width = width;
    int image_height = height;

    // int channel_size = image_width * image_height;
    // for (int i = 0; i < 3; i++)
    // {
    //     input.pitch[i] = image_width;
    //     (cudaMalloc((void**)&(input.channel[i]), channel_size));
    //     (cudaMemset(input.channel[i], 50 * 40 * i, channel_size));
    // }

    input.channel[0] = d_srcBGR;
    input.pitch[0] = image_width * 3;

    nvjpegBackend_t backend = NVJPEG_BACKEND_DEFAULT;

    nvjpegCreate(backend, nullptr, &nvjpeg_handle);
    
    nvjpegEncoderParamsCreate(nvjpeg_handle, &encoder_params, NULL);
    nvjpegEncoderStateCreate(nvjpeg_handle, &encoder_state, NULL);

    // set params
    nvjpegEncoderParamsSetEncoding(encoder_params, nvjpegJpegEncoding_t::NVJPEG_ENCODING_PROGRESSIVE_DCT_HUFFMAN, NULL);
    nvjpegEncoderParamsSetOptimizedHuffman(encoder_params, 1, NULL);
    nvjpegEncoderParamsSetQuality(encoder_params, 70, NULL);
    nvjpegEncoderParamsSetSamplingFactors(encoder_params, nvjpegChromaSubsampling_t::NVJPEG_CSS_420, NULL);

    cudaEventRecord(ev_start);
    nvjpegEncodeImage(nvjpeg_handle, encoder_state, encoder_params, &input, input_format, image_width, image_height, NULL);
    cudaEventRecord(ev_end);

    std::vector<unsigned char> obuffer;
    size_t length;
    nvjpegEncodeRetrieveBitstream(
        nvjpeg_handle,
        encoder_state,
        NULL,
        &length,
        NULL);

    obuffer.resize(length);
    nvjpegEncodeRetrieveBitstream(
        nvjpeg_handle,
        encoder_state,
        obuffer.data(),
        &length,
        NULL);

    std::ofstream outputFile(filepath, std::ios::out | std::ios::binary);
    outputFile.write(reinterpret_cast<const char *>(obuffer.data()), static_cast<int>(length));

    cudaEventSynchronize(ev_end);

    float ms;
    cudaEventElapsedTime(&ms, ev_start, ev_end);
    std::cout << "time spend " << ms << " ms" << std::endl;
    
    return 0;
}

需要说明的是,输入数据的形式由 input_format 指定,

image

image

从文档可知, NVJPEG_INPUT_BGRI 和 NVJPEG_INPUT_RGBI 是单数组形式存放的数据,赋值给channel[0],指定pitch[0]作为输入;

NVJPEG_INPUT_BGR 和 NVJPEG_INPUT_RGB 是分通道分别存放R、G、B 数据,pitch也分别对应。

 

测试效果样例:

image

 

 

 

 

 

 

 

 

 

 


 

搜索

复制

<iframe></iframe>

标签:ev,image,简单,encoder,nvjpeg,使用,input,NULL
From: https://www.cnblogs.com/betterwgo/p/16714751.html

相关文章

  • Rstudio,separate函数使用指南
    separate将一列数据分割为两列数据今天被困扰了一个多小时,是关于分隔符的问题。  想要将SNP1Loc这一列按照(进行分割,记得之前使用过separate进行分割,但是今天操作了......
  • 使用 JavaScript 的 Glassmorphic 计算器
    使用JavaScript的Glassmorphic计算器大家好!欢迎来到编码扭矩.在本博客中,我将向您解释如何使用HTML、CSS和JavaScript制作Glassmorphic计算器。这将是一个分......
  • 探索Java8:(五)Supplier和Consumer接口的使用
    Supplier是函数式编程的另一个接口,与Function、Predicate接口类似,区别在于Supplier不接收任何参数,只返回结果。Supplier的基本使用@FunctionalInterfacepublicinterfac......
  • 第八章 数组的使用和信号控制
    一、数组介绍1.什么是数组? 数组就是一系列元素的集合,一个数组内可以存放多个元素 2.为何要用数组? 我们可以用数组将多个元素汇总到一起,避免单独定义的麻烦二、数......
  • 24. Python lxml库的安装和使用
    1.前言lxml是Python的第三方解析库,完全使用Python语言编写,它对Xpath表达式提供了良好的支持,因此能够了高效地解析HTML/XML文档。本节讲解如何通过lxml库解析H......
  • 自己实现一个简单版的HashMap
    HashMap简介HashMap是一个散列表,它存储的内容是键值对(key-value)映射。HashMap继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。HashMap的实现......
  • 如何使用扫码SDK获取扫描成功之后的原图?
    ​1、问题描述项目中集成了华为的统一扫码SDK,开发一款二维码扫描的APP,项目是使用AndroidStudio开发,通过调用HMSScanSDK的api进行实现。但是遇到了一个问题:通过((HmsSc......
  • 一文教你如何使用Scan Kit快速生成带有logo的个性化二维码
    ​前言今天我们来实现一个小功能,通过使用扫码SDK来生成一个带有logo的个性化的二维码,话不多说,直接开始吧! 1、添加依赖1.1、配置HMSCoreSDK的Maven仓地址打开项目......
  • Vue中使用js-audio-recorder实现录音时提示:浏览器不支持getUserMedia!
    场景Vue中使用js-audio-recorder插件实现录音功能并实现上传Blob数据到SpringBoot后台接口:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126957202上面......
  • dotnet 使用 ConfigureAwait.Fody 库设置默认的 await 同步上下文切换配置
    在dotnet里面,使用await进行异步逻辑,默认是会尝试切换回调用await的线程同步上下文。这个机制对于大多数的上层应用来说都是符合逻辑且方便的逻辑,例如对于带UI线程......