JPEG库的移植(arm平台)
JPEG库的移植(arm平台)目次
[*]JPEG库的移植(arm平台)
[*]介绍
[*]头文件及全局变量
[*]1、图片显示
[*]2、其他图片压缩到jpg图片
[*]3、主函数及验证程序
[*]输出结果
介绍
图解
头文件及全局变量
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
/*
* Include file for users of JPEG library.
* You will need to have included system headers that define at least
* the typedefs FILE and size_t before you can include jpeglib.h.
* (stdio.h is sufficient on ANSI-conforming systems.)
* You may also wish to include "jerror.h".
*/
#include "jpeglib.h"
#pragma pack(1)
typedef struct tagBmpFileHeader // 文件头
{
unsigned short bfType; // 标识该文件为bmp文件,判断文件是否为bmp文件,即用该值与"0x4d42"比较是否相等即可,0x4d42 = 19778
unsigned long bfSize; // 位图文件大小,包括这14个字节。
unsigned short bfReserved1; // 预保留位,暂不用。
unsigned short bfReserved2; // 预保留位,暂不用。
unsigned long bfOffBits; // 图像数据区的起始位置
} BmpFileHeader; // 14字节:short2个,long4个
typedef struct tagBmpInfoHeader // 信息头
{
unsigned long biSize; // 本结构的长度,为40个字节。
long biWidth; // 宽度
long biHeight; // 高度
unsigned short biPlanes; // 目标设备的级别,必须是1。
unsigned short biBitCount; // 每个像素所占的位数(bit),其值必须为1(黑白图像)、4(16色图)、8(256色)、24(真彩色图),新的BMP格式支持32位色。
unsigned longbiCompression; // 压缩方式,有效的值为BI_RGB(未经压缩)、BI_RLE8、BI_RLE4、BI_BITFILEDS(均为Windows定义常量)。
unsigned longbiSizeImage; // 图像区数据大小,即实际的位图数据占用的字节数
long biXPelsPerMeter; // 水平分辨率,像素每米
long biYPelsPerMeter; // 垂直分辨率,单位是像素/米
unsigned long biClrUsed; // 位图实际用到的颜色数,如果该值为零,则用到的颜色数为2的biBitCount次幂。
unsigned short biClrImportant; // 位图显示过程,重要的颜色数;0--所有都重要
} BmpInfoHeader; // 40字节
#pragma pack()
int *lcd_mp;1、图片显示
int read_JPEG_file(char *filename, int start_x, int start_y){/* This struct contains the JPEG decompression parameters and pointers to * working space (which is allocated as needed by the JPEG library). */struct jpeg_decompress_struct cinfo;/* We use our private extension JPEG error handler. * Note that this struct must live as long as the main JPEG parameter * struct, to avoid dangling-pointer problems. */struct jpeg_error_mgr jerr;/* More stuff */FILE *infile; /* source file */unsigned char *buffer; /* Output row buffer */int row_stride; /* physical row width in output buffer *//* In this example we want to open the input file before doing anything else, * so that the setjmp() error recovery below can assume the file is open. * VERY IMPORTANT: use "b" option to fopen() if you are on a machine that * requires it in order to read binary files. */if ((infile = fopen(filename, "rb")) == NULL){ fprintf(stderr, "can't open %s\n", filename); return 0;}/* Step 1: allocate and initialize JPEG decompression object *//* We set up the normal JPEG error routines, then override error_exit. */cinfo.err = jpeg_std_error(&jerr);/* Now we can initialize the JPEG decompression object. */jpeg_create_decompress(&cinfo);/* Step 2: specify data source (eg, a file) */jpeg_stdio_src(&cinfo, infile);/* Step 3: read file parameters with jpeg_read_header() */(void)jpeg_read_header(&cinfo, TRUE);/* We can ignore the return value from jpeg_read_header since * (a) suspension is not possible with the stdio data source, and * (b) we passed TRUE to reject a tables-only JPEG file as an error. * See libjpeg.txt for more info. *//* Step 4: set parameters for decompression *//* In this example, we don't need to change any of the defaults set by * jpeg_read_header(), so we do nothing here. *//* Step 5: Start decompressor */(void)jpeg_start_decompress(&cinfo);/* We can ignore the return value since suspension is not possible * with the stdio data source. *//* We may need to do some setup of our own at this point before reading * the data.After jpeg_start_decompress() we have the correct scaled * output image dimensions available, as well as the output colormap * if we asked for color quantization. * In this example, we need to make an output work buffer of the right size. *//* JSAMPLEs per row in output buffer */row_stride = cinfo.output_width * cinfo.output_components; // 盘算一行的大小/* Make a one-row-high sample array that will go away when done with image */buffer = calloc(1, row_stride);/* Step 6: while (scan lines remain to be read) *//* jpeg_read_scanlines(...); *//* Here we use the library's state variable cinfo.output_scanline as the * loop counter, so that we don't have to keep track ourselves. */int data = 0;while (cinfo.output_scanline < cinfo.output_height){ /* jpeg_read_scanlines expects an array of pointers to scanlines. * Here the array is only one element long, but you could ask for * more than one scanline at a time if that's more convenient. */ (void)jpeg_read_scanlines(&cinfo, &buffer, 1); // 从上到下,从左到右RGB RGB RGB RGB for (int i = 0; i < cinfo.output_width; ++i) // 012 345 { data |= buffer
页:
[1]