libjpeg使用



     要实现图片在lcd上的显示,可以使用libjpeg库的解压功能,使用libjpeg库将jpg图片解压成RGB数据。
在lcd上描绘RGB数据即可显示图片

在libjpeg库的阅读文档libjpeg.txt中有解压的一般步骤:

   

Allocate and initialize a JPEG decompression object    // 分配和初始化一个decompression结构体
Specify the source of the compressed data (eg, a file) // 指定源文件
Call jpeg_read_header() to obtain image info           // 用jpeg_read_header获得jpg信息
Set parameters for decompression                       // 设置解压参数,比如放大、缩小
jpeg_start_decompress(...);                            // 启动解压:jpeg_start_decompress
while (scan lines remain to be read)
    jpeg_read_scanlines(...);                           // 循环调用jpeg_read_scanlines
jpeg_finish_decompress(...);                           // jpeg_finish_decompress
Release the JPEG decompression object                   // 释放decompression结构体
#include <stdio.h>
#include "jpeglib.h"
#include <setjmp.h>
int main(int argc, char **argv)
{
	struct jpeg_decompress_struct cinfo;
	struct jpeg_error_mgr jerr;
	FILE * infile;
	int row_stride;
	unsigned char *buffer;

	// 分配和初始化一个decompression结构体
	cinfo.err = jpeg_std_error(&jerr);
	jpeg_create_decompress(&cinfo);

	// 指定源文件
	if ((infile = fopen(argv[1], "rb")) == NULL) {
		fprintf(stderr, "can't open %s\n", argv[1]);
		return -1;
	}
	jpeg_stdio_src(&cinfo, infile);

	// 用jpeg_read_header获得jpg信息
	jpeg_read_header(&cinfo, TRUE);
	/* 源信息 */
	
	printf("image_width = %d\n", cinfo.image_width);
	printf("image_height = %d\n", cinfo.image_height);
	printf("num_components = %d\n", cinfo.num_components);

	// 设置解压参数,比如放大、缩小。并不是所有的缩放比例都可以实现。
	//1/2, 1/4, 1/8可以实现,其他的可以测试。
	printf("enter M/N:\n");
	scanf("%d/%d", &cinfo.scale_num, &cinfo.scale_denom);
	printf("scale to : %d/%d\n", cinfo.scale_num, cinfo.scale_denom);

	// 启动解压:jpeg_start_decompress	
	jpeg_start_decompress(&cinfo);

	/* 输出的图象的信息 */
	printf("output_width = %d\n", cinfo.output_width);
	printf("output_height = %d\n", cinfo.output_height);
	printf("output_components = %d\n", cinfo.output_components);
	
	// 一行的数据长度
	row_stride = cinfo.output_width * cinfo.output_components;
	buffer = malloc(row_stride);


	// 循环调用jpeg_read_scanlines来一行一行地获得解压的数据
	while (cinfo.output_scanline < cinfo.output_height) 
	{
		(void) jpeg_read_scanlines(&cinfo, &buffer, 1);
		//在这里实现在LCD上描绘一行数据的函数。
	}
	jpeg_finish_decompress(&cinfo);
	jpeg_destroy_decompress(&cinfo);

	return 0;
}

libjpeg库的功能很强大,在这里我们仅用到了它的解压功能。如果想更深入的了解它的功能,可以
阅读libjpeg.txt.


     要实现图片在lcd上的显示,可以使用libjpeg库的解压功能,使用libjpeg库将jpg图片解压成RGB数据。
在lcd上描绘RGB数据即可显示图片

在libjpeg库的阅读文档libjpeg.txt中有解压的一般步骤:

   

Allocate and initialize a JPEG decompression object    // 分配和初始化一个decompression结构体
Specify the source of the compressed data (eg, a file) // 指定源文件
Call jpeg_read_header() to obtain image info           // 用jpeg_read_header获得jpg信息
Set parameters for decompression                       // 设置解压参数,比如放大、缩小
jpeg_start_decompress(...);                            // 启动解压:jpeg_start_decompress
while (scan lines remain to be read)
    jpeg_read_scanlines(...);                           // 循环调用jpeg_read_scanlines
jpeg_finish_decompress(...);                           // jpeg_finish_decompress
Release the JPEG decompression object                   // 释放decompression结构体
#include <stdio.h>
#include "jpeglib.h"
#include <setjmp.h>
int main(int argc, char **argv)
{
	struct jpeg_decompress_struct cinfo;
	struct jpeg_error_mgr jerr;
	FILE * infile;
	int row_stride;
	unsigned char *buffer;

	// 分配和初始化一个decompression结构体
	cinfo.err = jpeg_std_error(&jerr);
	jpeg_create_decompress(&cinfo);

	// 指定源文件
	if ((infile = fopen(argv[1], "rb")) == NULL) {
		fprintf(stderr, "can't open %s\n", argv[1]);
		return -1;
	}
	jpeg_stdio_src(&cinfo, infile);

	// 用jpeg_read_header获得jpg信息
	jpeg_read_header(&cinfo, TRUE);
	/* 源信息 */
	
	printf("image_width = %d\n", cinfo.image_width);
	printf("image_height = %d\n", cinfo.image_height);
	printf("num_components = %d\n", cinfo.num_components);

	// 设置解压参数,比如放大、缩小。并不是所有的缩放比例都可以实现。
	//1/2, 1/4, 1/8可以实现,其他的可以测试。
	printf("enter M/N:\n");
	scanf("%d/%d", &cinfo.scale_num, &cinfo.scale_denom);
	printf("scale to : %d/%d\n", cinfo.scale_num, cinfo.scale_denom);

	// 启动解压:jpeg_start_decompress	
	jpeg_start_decompress(&cinfo);

	/* 输出的图象的信息 */
	printf("output_width = %d\n", cinfo.output_width);
	printf("output_height = %d\n", cinfo.output_height);
	printf("output_components = %d\n", cinfo.output_components);
	
	// 一行的数据长度
	row_stride = cinfo.output_width * cinfo.output_components;
	buffer = malloc(row_stride);


	// 循环调用jpeg_read_scanlines来一行一行地获得解压的数据
	while (cinfo.output_scanline < cinfo.output_height) 
	{
		(void) jpeg_read_scanlines(&cinfo, &buffer, 1);
		//在这里实现在LCD上描绘一行数据的函数。
	}
	jpeg_finish_decompress(&cinfo);
	jpeg_destroy_decompress(&cinfo);

	return 0;
}

libjpeg库的功能很强大,在这里我们仅用到了它的解压功能。如果想更深入的了解它的功能,可以
阅读libjpeg.txt.

libjpeg是一种开源的JPEG图像压缩,它提供了一些函数和工具,可以在应用程序中使用它来读取、写入和压缩JPEG图像。 1. 安装libjpeg使用libjpeg之前,需要先安装libjpeg。可以使用以下命令在Ubuntu系统中安装: ``` sudo apt-get install libjpeg-dev ``` 2. 读取JPEG图像 使用libjpeg读取JPEG图像需要以下步骤: - 定义一个jpeg_decompress_struct结构体,用于存储JPEG图像的信息和解压缩后的图像数据。 - 定义一个jpeg_error_mgr结构体,用于处理错误。 - 使用jpeg_create_decompress函数初始化jpeg_decompress_struct结构体。 - 使用jpeg_stdio_src函数将JPEG文件的文件指针关联到jpeg_decompress_struct结构体。 - 使用jpeg_read_header函数读取JPEG文件的头信息。 - 使用jpeg_start_decompress函数开始解压缩JPEG文件。 - 使用jpeg_read_scanlines函数逐行读取JPEG文件的像素数据。 - 使用jpeg_finish_decompress函数完成解压缩过程。 - 使用jpeg_destroy_decompress函数销毁jpeg_decompress_struct结构体。 以下是使用libjpeg读取JPEG图像的示例代码: ```c #include <stdio.h> #include <jpeglib.h> int main() { struct jpeg_decompress_struct cinfo; struct jpeg_error_mgr jerr; FILE *infile; JSAMPARRAY buffer; int row_stride; if ((infile = fopen("image.jpg", "rb")) == NULL) { printf("Can't open image file\n"); return 0; } cinfo.err = jpeg_std_error(&jerr); jpeg_create_decompress(&cinfo); jpeg_stdio_src(&cinfo, infile); jpeg_read_header(&cinfo, TRUE); jpeg_start_decompress(&cinfo); row_stride = cinfo.output_width * cinfo.output_components; buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1); while (cinfo.output_scanline < cinfo.output_height) { jpeg_read_scanlines(&cinfo, buffer, 1); // process the data } jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); fclose(infile); return 0; } ``` 3. 写入JPEG图像 使用libjpeg写入JPEG图像需要以下步骤: - 定义一个jpeg_compress_struct结构体,用于存储JPEG图像的信息和压缩后的图像数据。 - 定义一个jpeg_error_mgr结构体,用于处理错误。 - 使用jpeg_create_compress函数初始化jpeg_compress_struct结构体。 - 使用jpeg_stdio_dest函数将JPEG文件的文件指针关联到jpeg_compress_struct结构体。 - 使用jpeg_set_defaults函数设置JPEG图像的默认参数。 - 使用jpeg_set_quality函数设置JPEG图像的压缩质量。 - 使用jpeg_start_compress函数开始压缩JPEG图像。 - 使用jpeg_write_scanlines函数逐行写入JPEG图像的像素数据。 - 使用jpeg_finish_compress函数完成压缩过程。 - 使用jpeg_destroy_compress函数销毁jpeg_compress_struct结构体。 以下是使用libjpeg写入JPEG图像的示例代码: ```c #include <stdio.h> #include <jpeglib.h> int main() { struct jpeg_compress_struct cinfo; struct jpeg_error_mgr jerr; FILE *outfile; JSAMPROW row_pointer[1]; int row_stride; if ((outfile = fopen("output.jpg", "wb")) == NULL) { printf("Can't open output file\n"); return 0; } cinfo.err = jpeg_std_error(&jerr); jpeg_create_compress(&cinfo); jpeg_stdio_dest(&cinfo, outfile); cinfo.image_width = 640; cinfo.image_height = 480; cinfo.input_components = 3; cinfo.in_color_space = JCS_RGB; jpeg_set_defaults(&cinfo); jpeg_set_quality(&cinfo, 80, TRUE); jpeg_start_compress(&cinfo, TRUE); row_stride = cinfo.image_width * 3; while (cinfo.next_scanline < cinfo.image_height) { row_pointer[0] = &image_buffer[cinfo.next_scanline * row_stride]; jpeg_write_scanlines(&cinfo, row_pointer, 1); } jpeg_finish_compress(&cinfo); jpeg_destroy_compress(&cinfo); fclose(outfile); return 0; } ``` 4. 压缩JPEG图像 使用libjpeg压缩JPEG图像需要以下步骤: - 定义一个jpeg_compress_struct结构体,用于存储JPEG图像的信息和压缩后的图像数据。 - 定义一个jpeg_error_mgr结构体,用于处理错误。 - 使用jpeg_create_compress函数初始化jpeg_compress_struct结构体。 - 使用jpeg_stdio_dest函数将JPEG文件的文件指针关联到jpeg_compress_struct结构体。 - 使用jpeg_set_defaults函数设置JPEG图像的默认参数。 - 使用jpeg_set_quality函数设置JPEG图像的压缩质量。 - 使用jpeg_start_compress函数开始压缩JPEG图像。 - 使用jpeg_write_scanlines函数逐行写入JPEG图像的像素数据。 - 使用jpeg_finish_compress函数完成压缩过程。 - 使用jpeg_destroy_compress函数销毁jpeg_compress_struct结构体。 以下是使用libjpeg压缩JPEG图像的示例代码: ```c #include <stdio.h> #include <jpeglib.h> int main() { struct jpeg_compress_struct cinfo; struct jpeg_error_mgr jerr; FILE *infile, *outfile; JSAMPARRAY buffer; int row_stride; if ((infile = fopen("image.jpg", "rb")) == NULL) { printf("Can't open image file\n"); return 0; } if ((outfile = fopen("output.jpg", "wb")) == NULL) { printf("Can't open output file\n"); fclose(infile); return 0; } cinfo.err = jpeg_std_error(&jerr); jpeg_create_compress(&cinfo); jpeg_stdio_dest(&cinfo, outfile); jpeg_read_header(&cinfo, TRUE); jpeg_start_compress(&cinfo, TRUE); row_stride = cinfo.image_width * cinfo.input_components; buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1); while (cinfo.next_scanline < cinfo.image_height) { jpeg_read_scanlines(&cinfo, buffer, 1); jpeg_write_scanlines(&cinfo, buffer, 1); } jpeg_finish_compress(&cinfo); jpeg_destroy_compress(&cinfo); fclose(infile); fclose(outfile); return 0; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值