利用libjpeg库实现jpg与bmp图片互转指南

本文详细介绍了如何使用libjpeg库在Linux环境下进行jpg和bmp图片格式之间的转换。首先,介绍了jpg与bmp格式的基本原理和差异,然后讲解了libjpeg库的安装步骤。接着,提供了jpeg转bmp和bmp转jpeg的C语言代码实现,包括读取JPEG图像数据、转换RGB格式、写入BMP文件以及从BMP文件中读取RGB数据并压缩为JPEG的完整流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

jpg与bmp图片互转指南

一、原理:

​ jpg与bmp图片格式都是以rgb像素为基础的,但是jpg在bmp的rgb的基础上进行了压缩。而且存储的方式是bgr,因此,在二者转换过程中需要转换对应的格式,而且只需要的到rgb再使用libjpeg库即可进行互相转换。

二、转换工具:libjpeg库

移植jpeg库

1.下载JPEG库的源代码 http://www.ijg.org/files/ JPEG官方网站

2.jpegsrc.v9a.tar.gz 为源码文件,需要往自己的linux中安装该库

在家目录解压源码文件

cp ./jpegsrc.v9a.tar.gz /home

cd /home

tar -xvf jpegsrc.v9a.tar.gz

mkdir jpeg_lib

配置文件:
cd jpeg-9a

./configure --prefix=/home/jpeg_lib

make

make install

cd …/jpeg_lib/lib

cp ./* /lib

3.编译命令:

gcc xxx.c -o xxx -I/home/gec/jpeg_lib/include -L/home/gec/jpeg_lib/lib -ljpeg

4.当需要用到库的时候在头文件中加入:这些头文件

#include <stdio.h>
#include "jpeglib.h"
#include <setjmp.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h> 
#include <sys/mman.h>
#include <stdlib.h>
#include <string.h>

三、jpeg转为bmp

利用jpeg库从jpg图片获得rgb:

//读取并转换jpeg像素点为rgb像素点
GLOBAL(int)read_JPEG_file (const char * filename)
{
   
    //定义一个JPEG解码信息结构体
    struct jpeg_decompress_struct cinfo;

    //定义一个错误信息结构体
    struct my_error_mgr jerr;
    /* More stuff */
    FILE * infile;		/*定义源文件指针 标准IO的*/
    JSAMPARRAY buffer;		/*输出行缓冲*/
    int row_stride;		/*输出行缓冲的宽度 */

    //打开源文件 
    if ((infile = fopen(filename, "rb")) == NULL)
    {
   
        fprintf(stderr, "can't open %s\n", filename);
        return 0;
    }

    /* 第一步:初始化JPEG解码对象*/

    /* 我们开始初始化错误对象*/
    cinfo.err = jpeg_std_error(&jerr.pub);
    jerr.pub.error_exit = my_error_exit;
    if (setjmp(jerr.setjmp_buffer)) 
    {
   
        jpeg_destroy_decompress(&cinfo);
        fclose(infile);
        return 0;
    }

    /*现在我们可以初始化解码对象了*/
    jpeg_create_decompress(&cinfo);

    /*把源文件与解码对象关联起来 */
    jpeg_stdio_src(&cinfo, infile);

    /*读取JPEG图片的头数据*/
    (void) jpeg_read_header(&cinfo, TRUE);

    

    /*开始解码*/
    (void) jpeg_start_decompress(&cinfo);

    //得到一行数据所占用的字节数 
    row_stride = cinfo.</
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值