首页 > 其他分享 >jpeglib库使用

jpeglib库使用

时间:2024-05-24 08:57:33浏览次数:24  
标签:int 压缩 DestSize cinfo Dest jpeg 使用 jpeglib

文章目录

1、jpeglib库使用方式一

将RGB888源图片文件,进行压缩,并将压缩完成的数据写入到一个新的缓冲区,最后通过文件IO的方式,将压缩完成的数据,写入到xx.jpeg的文件中。利用文件打开写入完成的xx.jpeg,即可查看压缩完成的图片

#include <stdio.h>
#include "jpeglib.h"
#include <stdlib.h>
#include <string.h>

#define WIDTH   	800
#define HEIGHT		480
#define QUALITY     100
#define BPP			24   /*RGB888*/
#define RGB

/**
 * @*Src            需要压缩的源数据RGB888
 * @**Dest          压缩完成的数据存储到Dest
 * @SrcWidth        图片宽度
 * @SrcHeight       图片高低
 * @*DestSize       压缩完成的数据大小
 * @Quality         压缩质量
 * @Component       颜色通道数
 * 
*/
void RGB888_To_JPEG_To_Mem(unsigned  char *Src, unsigned  char **Dest, int SrcWidth, int SrcHeight, long int *DestSize, int Quality, int Component)
{
    int row_stride;
    JSAMPROW row_pointer[1];        /* 指向一行首的指针 */
    struct jpeg_error_mgr jerr;
    struct jpeg_compress_struct cinfo;

    // 为JPEG对象分配空间并初始化
    cinfo.err = jpeg_std_error(&jerr);
    jpeg_create_compress(&cinfo);

    /* 设置压缩参数:包括图像的大小和色彩空间 */
    cinfo.image_width = SrcWidth;       /* 图像宽度(像素) */
    cinfo.image_height = SrcHeight;     /* 图像高度(像素) */

    /* components:颜色通道数(组件数); 大多数应用程序使用RGB数据,RGB数据其每个像素三个组件(R、G、B),所以设置为3;
        如果是灰度数据, 每个像素一个组件, 就需要设置为1; */
    cinfo.input_components = Component;

    /* in_color_space(通常设置为以下两种)
        JCS_RGB(RGB): input_components设置为3时
        JCS_GRAYSCALE(灰度图): input_components设置为1时 */
    cinfo.in_color_space = JCS_RGB;     
	
    /* 提交设置的参数 */
    jpeg_set_defaults(&cinfo);
    /* 设置压缩质量 */
    jpeg_set_quality(&cinfo, Quality, TRUE);

    /* 给*Dest 分配空间,将压缩完成的数据存储到 *Dest; DestSize, 解压完成后的数据的大小; */
    jpeg_mem_dest(&cinfo, Dest, DestSize);

    /* 开始压缩 */
    jpeg_start_compress(&cinfo, TRUE);

    /* 一行像素数据的字节数 */
    row_stride = SrcWidth * (BPP >> 3);

    /* 按行将原始数据上传进行压缩 */
    while (cinfo.next_scanline < cinfo.image_height) {
        row_pointer[0] = Src + (cinfo.next_scanline * row_stride);
        jpeg_write_scanlines(&cinfo, row_pointer, 1);
    }

    /* 结束压缩 */
    jpeg_finish_compress(&cinfo);

    /* 销毁压缩对象 */
    jpeg_destroy_compress(&cinfo);
    
}

/* 主程序测试转换接口 */
int main()
{
    unsigned char *Dest = NULL;
    int Component = 0;
    long int DestSize = 0;
    unsigned char raw_image_888[800 * 480 * 3];

    /* 填充一张800 * 480的红色图片 */
	for (int i = 0; i < 800*480*3; i++) {
		if (0 == (i % 3)) {
			raw_image_888[i] = 0xFF;
		} else {
			raw_image_888[i] = 0x00;
		}
	}
	
#ifdef RGB
    Component = 3;
#elif GRAYSCALE 
    Component = 1;
#endif
    RGB888_To_JPEG_To_Mem(raw_image_888,&Dest, WIDTH, HEIGHT, &DestSize, QUALITY, Component);

    printf("DestSize = %ld\n",DestSize);

    /* 将Dest的数据写入到.jpeg文件, 进行测试*/
    FILE *file;

    file = fopen("./test.jpeg","wb");
    if (NULL == file) {
        printf("fopen error\n");
        return -1;
    }

    fwrite(Dest, DestSize, 1, file);
    
    fclose(file);

	return 0;
}

程序编译:生成a.out
在这里插入图片描述

程序执行:打印压缩后的数据大小,生成test.jpeg文件
在这里插入图片描述
打开test.jpeg文件,一张红色图片
在这里插入图片描述

标签:int,压缩,DestSize,cinfo,Dest,jpeg,使用,jpeglib
From: https://blog.csdn.net/2401_85241911/article/details/139162048

相关文章

  • Java面向对象-常用类(String 、StringBuffer 、StringBuilder的使用与深入)
    常用类-字符串相关类1什么是StringString是不可变类,即一旦一个String对象被创建,包含在这个对象中的字符序列是不可改变的,直至该对象被销毁。String类是final类,不能有子类。2分类StringStringBufferStringBuilder3String的使用packagecom.qf.string_c......
  • mingw 编译生成的dll 如何在vs中使用
    1.mingw编译生成dll gcc-shared-olibtest.dll-Wl,--output-def,libtest.def,--out-implib,dlltest.a xxx.oxxx.o  有2个文件是我们需要的2.vs使用lib.exe将XXX.def文件(函数定义文件)生成为.lib导入库(1)打开VS工具-》命令行-》powershell(想自己去VS安装目录下找......
  • Java 异常相关(二):异常处理机制的补充,自定义异常的使用等
    一、前言记录时间[2024-05-22]前置文章:Java异常相关:异常体系结构,异常与错误的区别等本文讲述Java异常相关知识,对异常处理机制进行补充,以及自定义异常的方式。文章对异常知识的描述显然是笼统而简洁的,对于异常的学习,更应注重平时的积累和整理。二、异常处理机......
  • 使用RAG和文本转语音功能,我构建了一个 QA 问答机器人
    节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学.针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。汇总合集:《大模型实战宝典》(2024版)正式发......
  • 如何使用语音情感基座模型emotion2vec+
        emotion2vec是一个由上海交通大学、阿里巴巴、复旦大学和香港中文大学的研究者们共同开发的通用语音情感表征模型。该模型通过自监督学习方法,在大量无标记的公开情感数据上进行预训练,以学习到高度通用的语音情感特征。模型旨在训练语音情感识别领域的“耳语”,通过......
  • Go:log库的全面指南与使用技巧
    引言在Go语言的标准库中,log包提供了简单而强大的日志功能。日志记录是软件开发中不可或缺的一部分,它不仅帮助开发人员调试和排查问题,还在系统运行中提供了宝贵的运行时信息。本文将详细讲解Go语言log库的各种功能及其使用技巧,帮助开发者更好地掌握和应用这一重要工具。log......
  • Qt线程使用方法三:QtConcurrent::run
    在Qt中,QFuture和QtConcurrent模块提供了一种简便的方式来执行并行任务。QFuture用于接收异步操作的结果,而QtConcurrent提供了一些函数来启动异步操作。这种方法不需要直接使用QThread,而是通过高级API来管理线程池和任务。 步骤 1: 包含必要的头文件 首先,确保你的项目文件(如......
  • Qt线程使用方法二:派生QThread
    在Qt中,从QThread派生一个子类并在构造函数中传入需要执行的方法,然后在线程中运行该方法并通知执行结果,是一种常见的多线程处理模式。以下是如何实现这一功能的步骤和示例代码: 步骤 1: 定义线程类 首先,定义一个从QThread派生的线程类。在这个类中,你可以定义一个函数指针或者......
  • 使用本地大语言模型和Langchain手搓免费的AI搜索问答助手
    1概述大语言模型虽然已经有了很多的背景知识,但针对模型训练之后新产生的内容,或者领域内的知识进行提问,大模型本身通常无法准确给出回应,一个常用的解决方法是,借助检索增强生成(RAG),将能够用于回答问题的相关上下文给到大模型,利用大模型强大的理解和生成能力,来缓解这个问题。本文主......
  • mysql中索引的使用
    大家好,我们知道创建索引是要付出时间和空间的代价的,只有合理的创建索引才能提高查询效率。今天我们来聊一聊如何优雅的,合理的使用索引。上篇文章我们讲到了在索引在where查询过程中是如何发挥作用的,今天我们再谈谈索引在排序和分组的时候是如何使用的。为了方便讲解,我们依......