Linux中使用libjpeg读取jpeg的data(不含文件头)

linux v4l 读取相机原始数据 v4l 读原始数据 libjpeg 保存 /* * capturing from UVC cam * requires: libjpeg-dev * build: gcc -std=c99 capture.c -ljpeg -o capture */ #include <stdint.h> #include <stdlib.h> #include <s... 阅读详情

1、背景、

有时候在项目中需要用到底层c语言去读取图像像素值,移植opencv中的imread函数,涉及到图片的编解码,以及其他的函数,使得项目开展十分麻烦,所以我们可以借助第三方库来实现像素值的读取操作。

2、libjpeg下载,编译

下载地址:这里

There is a Windows format package in zip archive format jpegsr9d.zip and a Unix format package in tar.gz archive format jpegsrc.v9d.tar.gz,根据需要选择。

1、./configure#配置

2、make#编译

3、make install#默认安装到/usr/local/lib/下,所以在编译时记得指定链接库地址

3、使用libjpeg

#include <stdio.h>
#include <stdlib.h>
#include <jpeglib.h> 
/*
 *	Descr: 读取jpeg文件的data内容(取出文件头信息)
 *	@param input_filename :jpeg文件路径(含文件名)输入
 *	@param output_buffer :返回指向数据地址的指针
 *	@param  
 *	@Author :Libin
 *	@return :成功返回0,失败返回-1
*/
 int read_jpeg_file(const char *input_filename, char **output_buffer)
 {
         struct jpeg_decompress_struct cinfo;
         struct jpeg_error_mgr jerr;
         FILE *input_file;
         FILE *output_file;
         JSAMPARRAY buffer;
         int row_width;
 
         unsigned char *rowdata = NULL;
        
         cinfo.err = jpeg_std_error(&jerr);
        

         if ((input_file = fopen(input_filename, "rb")) == NULL) {
                 fprintf(stderr, "can't open %s\n", input_filename);
                 return -1;
         }
        
 
         // 1、Initialization of JPEG compression objects
	    jpeg_create_decompress(&cinfo);
 
         /* Specify data source for decompression */
         jpeg_stdio_src(&cinfo, input_file);
 
         /* 1.设置读取jpg文件头部,Read file header, set default decompression parameters */
         (void) jpeg_read_header(&cinfo, TRUE);
 
         /* 2.开始解码数据 Start decompressor */
         (void) jpeg_start_decompress(&cinfo);
 
         row_width = cinfo.output_width * cinfo.output_components;

        
 
	    /* 3.跳过读取的头文件字节Make a one-row-high sample array that will go away when done with image */
         buffer = (*cinfo.mem->alloc_sarray)
                 ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_width, 1);
         
         printf("Get image width:%d,height:%d\n",row_width,cinfo.output_height);
         *output_buffer = (unsigned char *)malloc(row_width * cinfo.output_height);
         memset(*output_buffer, 0, row_width * cinfo.output_height);
         rowdata = *output_buffer;
       
 
         /* 4.Process data由左上角从上到下行行扫描 */
         while (cinfo.output_scanline < cinfo.output_height) {
                 (void) jpeg_read_scanlines(&cinfo, buffer, 1);

                 memcpy(rowdata, *buffer, row_width);
                 rowdata += row_width;
        }
         
         //free(output_buffer);
         (void) jpeg_finish_decompress(&cinfo);
          printf("Get iamge data ,buffer size=%d\n",strlen((const char* ) *output_buffer));
         jpeg_destroy_decompress(&cinfo);
 
         /* Close files, if we opened them */
         fclose(input_file);
 
        return 0;
 }
 int main()
 {
  
    const char* input_filename="/home/libin/Code/jpeg-9/testimgp.jpg";
    char *outbuffer=NULL;
    read_jpeg_file(input_filename,&outbuffer);
    printf("Get iamge data ,buffer size=%d\n",strlen((const char* ) outbuffer));
   
    free(outbuffer);//释放malloc的地址,否则可能造成内存泄漏
    
    return 0;
 }

编译时可以自己写一个简单的makefile。例如:

CC = gcc
CFLAGS = -g -Wall -O 
LIBJPEGLIBS = -L/usr/local/lib/ -ljpeg
main:main.o
	$(CC) decodejpeg.o -o decodejpeg $(LIBJPEGLIBS)
main.o:decodejpeg.c
	$(CC) $(CFLAGS) -c decodejpeg.c 
clean:
	rm -rf ./*.o decodejpeg

在当前目录下会生成可执行文件。

Linux图像压缩原理与CLI工具链实战指南 图像压缩在Linux系统中远不止调低质量参数,其本质是基于色彩空间转换、离散余弦变换(DCT)、量化表映射与熵编码的多层处理过程。JPEG的有损压缩核心在于量化阶段,而PNG依赖行滤波与DEFLATE字典压缩实现无损优化;WebP则融合二者优势并支持Alpha通道。理解这些底层机制,才能规避二次压缩失真、元数据误删、GUI工具兼容性失效等高频问题。本文聚焦Linux环境下jpegoptim、mogrify、cwebp、pngcrush等主流CLI工具的职责边界、参数陷阱与协同策略,覆盖从单图诊断到千图批量的 阅读详情

相关推荐

PHP GD库imagecreatefromjpeg()函数安全漏洞深度解析与实战靶场搭建

图像处理是Web开发中的基础功能,PHP的GD库作为动态创建和处理图像的标准扩展,其核心函数imagecreatefromjpeg()负责JPEG格式的解码工作。该函数的工作原理是将JPEG文件数据流解析为内存中的图像资源,涉及复杂的格式解析和内存管理。在安全层面,图像解码过程可能成为攻击面,特别是当处理用户上传的不可信文件时,底层依赖的libjpeg库若存在缓冲区溢出、整数溢出等内存安全漏洞,可能导致服务端异常、信息泄露甚至远程代码执行。结合Drupal 7等老旧CMS环境和特定版本的Apache/PHP

weixin_34168880的博客 599

openMVG+openMVS 排错指南:3 类常见 libjpeg 错误与相机参数配置详解

本文详细解析了OpenMVG与OpenMVS组合在三维重建中常见的libjpeg兼容性问题与相机参数配置错误。通过三类典型libjpeg错误分析(符号表冲突、ABI不兼容、运行时加载失败)和相机传感器宽度配置指南,提供从检测脚本到修复命令的完整排错方案,帮助开发者高效解决重建流程中的关键技术障碍。

weixin_33981932的博客 369

JPEG压缩式CNN训练优化:提升吞吐量37%的预处理重构方法

在深度学习训练中,数据预处理常被视作‘辅助环节’,但实际它显著制约GPU利用率与端到端吞吐量。本文从图像频域本质出发,解析DCT系数作为低维判别性特征的理论基础,阐明传统resize/normalize/to_tensor链路引发的内存、计算与IO三重冗余;进而提出将预处理升维为可学习、可微分的‘特征前置处理器’——通过libjpeg-turbo底层介入提取Y分量4×4低频DCT块,经轻量MLP嵌入与线性融合生成伪图像张量,实现CPU-GPU协同优化。该方法已在PyTorch 1.12+实测验证,适用于Im

记录技术点点之路 375

jpeg入门学习笔记

#include #include "jpeglib.h" #include int main(int argc,char **argv) { struct jpeg_decompress_struct cinfo; struct jpeg_error_mgr jerr; FILE * infile; cinfo.err=jpeg_std_error(&jer

ap105638的专栏 1311

Linux下高效压缩图片:CLI与GUI协同实战指南

图像压缩是Web性能优化、带宽控制和终端体验提升的基础技术,其核心在于理解JPEG/WEBP等格式的编码原理、量化表机制与元数据结构。在Linux环境中,ImageMagick提供全格式处理能力,jpegoptim专注JPEG流层优化,二者结合可实现无损质量保障下的体积缩减25%~50%。技术价值体现在批量处理可审计性、CLI-GUI分层协作(如gThumb调用magick后端)及对HEIC/WebP/AVIF等现代格式的原生支持。典型应用场景包括前端静态资源优化、树莓派图像传输、电商图库自动化处理及科研截

weixin_30700099的博客 355

Linux下fastai Chapter 2实战排障:DataBlock与CUDA深度优化

DataBlock是fastai构建数据流水线的核心抽象,其在Linux环境下的行为受文件系统权限、路径解析机制、多进程调度及CUDA内存管理等底层因素深刻影响。理解其依赖链——从Python的pathlib遍历、PIL图像解码,到torch DataLoader的fork子进程与cuMemAlloc显存分配——是解决FileNotFoundError、PermissionError和CUDA out of memory等问题的前提。Linux原生环境不隐藏系统细节,反而暴露了PyTorch、PIL、Ope

weixin_34337381的博客 535

jpeg2mpeg

jpeg2mpeg 遇到的问题总结 0. jpeg_read_raw_data(cinfo, JSAMPIMAGE data, max_lines); data 指针的正确理解。     如果没搞好,立马segfault或segabort。 jpeglib.h中的定义: typedef unsigned char JSAMPLE; typedef JSAMPLE FAR *JSAMPRO

deyangliu的专栏 2033

GEC6818嵌入式Linux电子相册开发:从Framebuffer到触摸交互全解析

在嵌入式Linux应用开发中,图形用户界面(GUI)的实现是连接硬件与用户交互的关键技术。其核心原理在于通过Framebuffer驱动直接操作显示缓冲区,将图像数据映射到屏幕像素,并结合输入子系统处理触摸事件。这项技术的工程价值在于能够在不依赖重量级图形框架(如Qt)的情况下,构建出高效、响应迅速的嵌入式交互应用,尤其适用于资源受限的物联网设备、工业控制面板等场景。本文以GEC6818开发板为硬件平台,深入探讨了如何利用**双缓冲机制**消除屏幕闪烁,并通过**触摸事件解析**实现精准的手势识别,最终完成一

weixin_34409357的博客 372

jpeg 文件转换成yuv

某天接到个任务,要求读取jpeg文件转换成YUV格式,因为从来没有过这样的经历,第一反应上GOOGLE。    刚开始的做法是直接读取jpeg文件读取RGB,然后直接RGB转换成YUV。 但后来同事说jpeg文件本事就是YUV颜色编码,可以直接读取成YUV。于是乎又要开始新的搜索了。     刚开始搜索接触到了jpeglib这个库,大概了解了下jpeglib库和jpeg文件的格式。刚开始直接读

Xinke_927846的专栏 4164

C++实现远程桌面核心原理:从屏幕捕获到网络传输的完整技术方案

远程桌面技术作为网络编程与系统集成的典型应用,其核心原理基于客户端/服务器架构,通过屏幕捕获、图像编码压缩和网络传输实现远程控制。在技术实现层面,涉及操作系统API调用、图形图像处理、数据压缩算法和网络协议设计等多个基础领域。对于C++开发者而言,掌握远程桌面的完整技术链条不仅能深入理解系统级编程,还能为定制化开发提供坚实基础。本文聚焦于**屏幕捕获**和**图像编码**这两个关键技术环节,通过实际代码演示如何从零构建一个可运行的远程桌面原型,涵盖GDI捕获、JPEG压缩和TCP传输等核心模块的实现细节,为

weixin_30458043的博客 530

C++远程控制客户端开发:从Socket通信到屏幕捕获的实战解析

网络编程是计算机系统间通信的基础,其核心在于通过套接字(Socket)实现可靠的数据传输。理解TCP/IP协议栈的工作原理,掌握字节流处理与粘包拆包机制,是构建稳定网络应用的关键。在追求高性能、低延迟的场景中,C++因其对内存和计算资源的精细控制而成为首选。通过自定义应用层协议,开发者可以设计高效的消息格式,满足远程控制等实时交互需求。屏幕捕获与编码技术进一步优化了数据传输效率,例如利用libjpeg-turbo进行图像压缩,大幅减少带宽占用。这些技术共同支撑了远程桌面、远程协助等应用场景的实现。本文聚焦于

weixin_30596343的博客 390

图像解码之一:使用libjpeg解码jpeg图片

多媒体应用在现在电子产品中的地位越来越重要,尤其是在嵌入式设备中。本系列文章将会介绍利用libjpeg解码jpeg文件,libpng解码png文件,libgif解码gif文件。本文为第一篇,介绍使用libjpeg解码jpeg文件。 libjpeg简介     libjpeg是一个完全用C语言编写的库,包含了被广泛使用的JPEG解码、JPEG编码和其他的JPEG功能的实现。这个库

GG之家 5301

Linux下fastai第二章环境配置实战:PyTorch+CUDA+PIL全链路排错

DataBlock和cnn_learner是fastai的核心抽象,但其底层依赖PyTorch、CUDA、PIL、OpenCV与系统库的协同运行,才是Linux部署真正的技术门槛。本文从Linux发行版(Ubuntu 22.04/Debian 12)的glibc兼容性、NVIDIA驱动与CUDA工具链匹配原理出发,解析torch.cuda.is_available()失效、OSError: encoder jpeg not available等高频报错的本质成因;强调分层锁定(系统驱动→Miniforge

weixin_30417487的博客 327

Python图像处理入门:Pillow库读取、显示与保存图片的实战指南

图像处理是计算机视觉和数字媒体领域的核心技术,涉及对图像数据的获取、分析和操作。其基本原理是通过算法对像素矩阵进行变换,以实现增强、压缩或识别等目的。在Python生态中,Pillow库作为PIL的现代分支,因其简洁的API和强大的格式支持,成为图像处理任务的首选工具,尤其适合快速原型开发和自动化脚本编写。无论是为机器学习项目准备数据集,还是构建需要图像上传功能的Web应用,掌握图片的读取、显示与保存都是基础且关键的步骤。本文聚焦于Pillow库在这些核心操作中的实战应用,深入探讨了文件路径处理、懒加载机制

weixin_30647065的博客 504

STM32H743硬件JPEG解码器实现LCD快速显示方案与源码解析

在嵌入式开发中,图像解码常被视为CPU的沉重负担,尤其当涉及大尺寸JPEG图片时,软件解码不仅耗时且占用大量处理资源。硬件加速技术因此成为提升系统实时性的关键路径。STM32H743内置的硬件JPEG解码器,通过专用电路完成解码运算,CPU仅需配置参数与搬运数据,大幅降低负载。配合DMA双缓冲与DMA2D图形加速,可实现从SD卡读取图片到LCD屏幕显示的完整链路,且全程无需CPU干预。该方案广泛应用于智能家居面板、工业HMI、车载仪表盘等带屏产品,有效解决图片切换卡顿、系统响应慢等痛点。本文围绕STM32H

weixin_34015336的博客 463

从零开始掌握RDMA拥塞控制:原理、算法与实战解析

本文深入解析了RDMA拥塞控制的核心原理与实战配置。RDMA依赖无损网络保障高性能,其关键在于PFC与ECN两大技术协同防止丢包。文章重点剖析了主流算法DCQCN的工作机制与参数调优,并简要介绍了HPCC与TIMELY等前沿算法。最后提供了在Linux上配置RoCEv2与DCQCN的详细步骤及性能调试方法,帮助读者从零构建稳定的RDMA网络环境。

weixin_28452161的博客 137

MFC C++跨平台远程桌面实现:架构设计与工程实践

远程桌面控制技术基于客户端-服务器架构,通过网络协议传输屏幕图像与输入指令,实现跨系统操作。其核心原理在于高效的屏幕捕获、编码压缩与网络传输,技术价值在于打破平台壁垒,实现异构系统的统一管理。在工业控制、嵌入式运维等场景中,常需复用现有成熟客户端代码以降低成本。本文聚焦于在传统MFC框架中实现跨平台远程控制,通过协议抽象与平台相关后端分离,使MFC客户端能连接并控制Windows与Linux系统。文中深入探讨了使用X11进行屏幕捕获与输入模拟、以及利用libjpeg-turbo进行图像压缩等关键技术细节,为

weixin_34332905的博客 425

(八)基于MuJoCo的LeRobot SO100仿真操控实战指南(操作优化)

本文详细介绍了如何在MuJoCo仿真环境中搭建并优化LeRobot SO100机械臂的操控。通过两种核心模式(纯键盘仿真与实机镜像同步)的实战演示,重点讲解了关键的参数标定方法,以实现虚拟模型与真实硬件的精准同步。文章还提供了性能优化技巧,旨在帮助开发者构建高效、安全的机器人算法开发与测试流程。

weixin_29083649的博客 320

stb_image_write.h:轻量级图像保存架构的工程化替代方案

在资源受限的嵌入式系统、游戏引擎和跨平台应用中,图像保存功能往往成为技术架构的瓶颈。传统图像库如libpng、libjpeg等虽然功能全面,但其复杂的依赖链、庞大的二进制体积以及繁琐的编译配置,严重影响了项目的部署效率和维护成本。stb_image_write.h作为单文件头文件库,提供了零依赖、高性能的图像保存解决方案,从根本上重构了图像输出架构的技术路径。 ## 问题场景:传统图像保存架构的

gitblog_00351的博客 471

【SPSS实战】手动实现Quade非参数协方差分析:从数据准备到结果解读

本文详细介绍了在SPSS中手动实现Quade非参数协方差分析的全过程。针对数据不满足正态性和方差齐性假设时,如何通过秩转换、回归调整残差,并最终利用Kruskal-Wallis检验完成组间比较。该方法为处理含协变量的非参数多组比较问题提供了清晰的实战解决方案,并探讨了其与标准Quade检验的异同及适用场景。

weixin_29306317的博客 357

深入构建加密货币价格预测系统:从数据获取到模型优化的完整指南!

🏆本文收录于「编程与技术实战」专栏,此专栏涵盖了C/C++编程、人工智能、数据结构、机器学习等技术领域的内容,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

**My Coding Family** 1276
上一篇: cmake 编译出现“CMake Error at aten/src/ATen/CMakeLists.txt:226 (set_property): set_property could not”
下一篇: 机器学习-逻辑回归算法推理+代码复现
LiBin1103
博客等级 码龄9年 38粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值