jpeg库下载地址:
http://www.ijg.org/ 交叉编译三部曲:
A ./configure --host=arm-linux-gcc --prefix=/home/flying/jpeg-install
B make
C make install
jpeg库是解压jpeg/jpg图片或将图片压缩为jpeg/jpg格式所用到的库,使用起来比较简单!

jpeg/jpg解码过程:

    1. 创建jpeg对象和错误处理对象
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr; 2. 将错误处理对象绑定到jpeg对象上
EXTERN(struct jpeg_error_mgr *) jpeg_std_error
JPP((struct jpeg_error_mgr * err)); 3. 初始化jpeg对象
#define jpeg_create_compress(cinfo) \
jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, \
(size_t) sizeof(struct jpeg_compress_struct)) 4. 指定解压数据源(有两种方式)
a. EXTERN(void) jpeg_mem_src JPP((j_decompress_ptr cinfo, const unsigned char * inbuffer, unsigned long insize));
参数一: jpeg对象地址
参数二: 储存jpeg数据源缓冲区
参数三: 缓冲区数据源大小 b. EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile));
参数一: jpeg对象地址
参数二: 要解压的jpeg图片的文件指针 5. 填充cinfo对象的缺省信息,常见的可用信息包括图像的
宽: cinfo.image_width,
高: cinfo.image_height,
色彩空间: cinfo.jpeg_color_space,
颜色通道数: cinfo.num_components等。
EXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo,
boolean require_image)); 6. 为解压设定参数**(依情况而定)**
比如解压的图片与原图的缩放比例为1/2,这可以设置参数
cinfo.scale_num = 1
cinfo.scale_denom = 2 7. 开始解压
EXTERN(boolean) jpeg_start_decompress JPP((j_decompress_ptr cinfo)); 在完成解压缩操作后,会将解压后的图像信息填充至cinfo结构中。比如,输出图
像宽度cinfo.output_width,输出图像高度cinfo.output_height,每个像
素中的颜色通道数cinfo.output_components(比如灰度为1,全彩色为3)
等。
一般情况下,这些参数是在jpeg_start_decompress后才被填充到cinfo中
的,如果希望在调用jpeg_start_decompress之前就获得这些参数,可以通过
调用jpeg_calc_output_dimensions()的方法来实现。 8. 取数据
解压出来的数据是按照行取出的,从左到右,从上到下的顺序,每个像
素对应的各颜色或灰度通道数据是依次存储,24位RGB图解压后的颜色
通道排序是R,G,B,R,G,B...... 我们可以使用此函数取出循环取出数据:
extern JDIMENSION jpeg_read_scanlines(j_decompress_ptr, JSAMPARRAY,
JDIMENSION);
参数二: 一般来说就是unsigned char *,表示保存数据的缓冲区
参数三: 表示要读取的行数 9. 解压完毕释放资源
boolean jpeg_finish_decompress(j_decompress_ptr cinfo); 后续不需要使用jpeg对象:
void jpeg_destroy_decompress(j_decompress_ptr cinfo); 如果在后续还需使用jpeg对象,则使用:
void jpeg_abort_decompress(j_decompress_ptr cinfo);
实例:
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <linux/fb.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <stdbool.h> #include "jpeglib.h"
#include "my_err.h" struct image_info
{
int width;
int height;
int pixel_size;
}; //将图片显示到LCD屏幕上,最后两个参数指定显示的原点坐标
void write_jpeg_to_lcd(unsigned char *lcdmem, unsigned char *rgb_buffer
, struct fb_var_screeninfo *vinfo, struct image_info *image_info
, size_t xoffset, size_t yoffset)
{
assert(lcdmem);
assert(rgb_buffer);
assert(vinfo);
assert(image_info); int x, y; size_t r_offset = vinfo->red.offset / 8;
size_t g_offset = vinfo->green.offset / 8;
size_t b_offset = vinfo->blue.offset / 8; for (y = 0; (y < vinfo->yres - yoffset) && (y < image_info->height); ++y) { for (x = 0; (x < vinfo->xres - xoffset) && (x < image_info->width); ++x) { size_t image_offset = (x * image_info->pixel_size) + (image_info->width * image_info->pixel_size * y);
size_t lcd_offset = ((x + xoffset) * vinfo->bits_per_pixel / 8) + ((y + yoffset) * vinfo->xres * vinfo->bits_per_pixel /8); memcpy(lcdmem + lcd_offset + r_offset, rgb_buffer + image_offset, 1);
memcpy(lcdmem + lcd_offset + g_offset, rgb_buffer + image_offset + 1, 1);
memcpy(lcdmem + lcd_offset + b_offset, rgb_buffer + image_offset + 2, 1);
}
}
} void read_image_from_file(int fd, unsigned char *jpeg_buffer, size_t image_size)
{
assert(jpeg_buffer); int nread = 0; while (image_size > 0) {
nread = read(fd, jpeg_buffer, image_size);
if (nread < 0) {
if (EINTR == errno) {
continue;
} else {
err_sys("read error");
}
} image_size -= nread;
jpeg_buffer += nread;
}
} int main(int argc, char **argv)
{
if (2 != argc) {
err_quit("Usage: %s <*.jpeg/jpg>\n", argv[1]);
} int image_fd;
if ((image_fd = open(argv[1], O_RDONLY)) < 0) {
err_sys("open error");
} struct stat sbuf;
if (fstat(image_fd, &sbuf) < 0) {
err_sys("stat error");
} unsigned char *jpeg_buffer = calloc(1, sbuf.st_size);
read_image_from_file(image_fd, jpeg_buffer, sbuf.st_size); struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr; cinfo.err = jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo); jpeg_mem_src(&cinfo, jpeg_buffer, sbuf.st_size); if (JPEG_HEADER_OK != jpeg_read_header(&cinfo, true)) {
err_sys("read head error");
} jpeg_start_decompress(&cinfo); struct image_info *image_info = calloc(1, sizeof(struct image_info));
if (image_info == NULL) {
err_sys("calloc error for image_info");
} image_info->width = cinfo.output_width;
image_info->height = cinfo.output_height;
image_info->pixel_size = cinfo.output_components; int row_stride = image_info->width * image_info->pixel_size;
size_t rgb_size = row_stride * image_info->height; unsigned char *rgb_buffer = calloc(1, rgb_size);
if (rgb_buffer == NULL) {
err_sys("rgb_buffer error");
} //循环读取解压后的数据,cinfo.output_scanline表示当前读取的行数
while (cinfo.output_scanline < image_info->height) {
unsigned char *buffer_array[1];
buffer_array[0] = rgb_buffer + cinfo.output_scanline * row_stride;
jpeg_read_scanlines(&cinfo, buffer_array, 1);
} jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
free(jpeg_buffer); int lcd_fd;
if ((lcd_fd = open("/dev/fb0", O_RDWR)) < 0 ) {
err_sys("open error");
} struct fb_var_screeninfo vinfo;
ioctl(lcd_fd, FBIOGET_VSCREENINFO, &vinfo); size_t mem_size = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;
unsigned char *lcdmem = mmap(0, mem_size, PROT_READ|PROT_WRITE, MAP_SHARED, lcd_fd, 0);
if (lcdmem == MAP_FAILED) {
err_sys("mmap error");
} write_jpeg_to_lcd(lcdmem, rgb_buffer, &vinfo, image_info, 100, 100); free(rgb_buffer);
munmap(lcdmem, mem_size);
close(lcd_fd);
close(image_fd); return EXIT_SUCCESS;
}
参考博客:
http://blog.csdn.net/xipiaoyouzi/article/details/53257720

jpeg解码库使用实例的更多相关文章

  1. 不用第三方解码库取得图片宽高 附完整C++算法实现代码

    在特定的应用场景下,有时候我们只是想获取图片的宽高, 但不想通过解码图片才取得这个信息. 预先知道图片的宽高信息,进而提速图片加载,预处理等相关操作以提升体验. 在stackoverflow有一篇相关 ...

  2. 玩node-images模块---Node.js轻量级跨平台图像编解码库

    Node.js轻量级跨平台图像编解码库 github:https://github.com/zhangyuanwei/node-images Features 功能特性 轻量级:无需安装任何图像处理库 ...

  3. 编译skia静态库时,图片解码库无法注册的问题

    转载:http://www.cnblogs.com/imlucky/archive/2012/08/01/2617851.html 今天编译skia库,增加图片解码库时总是无效.按照此博客的方法修改后 ...

  4. 简单易用的图像解码库介绍 —— stb_image

    原文链接:简单易用的图像解码库介绍 -- stb_image 说到图像解码库,最容易想起的就是 libpng 和 libjpeg 这两个老牌图像解码库了. libpng 和 libjpeg 分别各自对 ...

  5. 海思h264解码库

    海思的dll,解码h264  解码后转出yuv12 dll自己百度下载  hi_h264dec.dll   hi_h264dec_w.dll   调用方法: if (H264Dec.Hi264DecA ...

  6. 海思H264解码库 hi_h264dec_w.dll 水印问题

    上一篇   海思h264解码库 , 实现了H264帧的简单解码,但更换相机后,出现了解码视频中央出现水印的问题,水印如下图 查找网络,基本就这一篇相关的,还没给出好的解决办法. http://bbs. ...

  7. 使用SharePoint Designer定制开发专家库系统实例!

    将近大半年都没有更新博客了,趁这段时间不忙,后续会继续分享一些技术和实际应用.对于Sharepoint的定制开发有很多种方式,对于一般的应用系统,可以使用Sharepoint本身自带的功能,如列表作为 ...

  8. 推荐一个c++小巧开源且跨平台的图像解码库

    该图像解码库仅仅三个文件. 图像处理封装: spot.cpp spot.h 解码库实现: spot.c 支持图片文件格式如下: File format Read Write BMP files yes ...

  9. Emoji表情编解码库XXL-EMOJI

    <Emoji表情编解码库XXL-EMOJI> 一.简介 1.1 概述 XXL-EMOJI 是一个灵活可扩展的Emoji表情编解码库,可快速实现Emoji表情的编解码. 1.2 特性 1.简 ...

随机推荐

  1. 通过ps给透明通道的图片添加灰度(适用于需要兼容IE7,效果很好)

    原始的图片是这样的 第一步: 第二步: 第三步: 第四步: 更多(文字居中): 1: 2: 3: 4:

  2. 关于Git的一些操作记录

    本文是我的一些记录,不按教学顺序 1.如何添加不上传的文件或文件夹,并且将已经添加到远程库的文件夹删除 操作过程如下: vim .gitignore // 按i进入编辑模式 写入 node_modul ...

  3. BZOJ 4892 [Tjoi2017]dna 哈希+二分

    自己简直是傻死了...对于位置想错了... 二分出来的是LCP长度$+1$,即每一次二分出来的最后一个点都是失配的,而就算失配也会跳过这个点:所以当$k<=3$且模式串$s2$的指针$>l ...

  4. 【ACM】一种排序

    一种排序 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复:还知道这个长方形的宽和长,编号.长.宽都是整数 ...

  5. 几种复杂度的斐波那契数列的Java实现

    一:斐波那契数列问题的起源 13世纪初期,意大利数论家Leonardo Fibonacci在他的著作Liber Abaci中提出了兔子的繁殖问题: 如果一开始有一对刚出生的兔子,兔子的长大需要一个月, ...

  6. SQL海量数据读写性能优化

    这是给某数据中心做的一个项目,项目难度之大令人发指,这个项目真正的让我感觉到了,商场如战场,而我只是其中的一个小兵,太多的战术,太多的高层之间的较量,太多的内幕了.具体这个项目的情况,我有空再写相关的 ...

  7. C#与JAVA学习感悟

    C#与JAVA学习感悟 学完C#与JAVA,感觉收获良多.C#与JAVA这两门语言相似度很高(了解它们早期历史的人可能知道为什么),也许很多人在学习JAVA(或C#)时会同时学习C#(或JAVA),因 ...

  8. ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第九天(非原创)

    文章大纲 一.课程介绍二.今日功能介绍三.项目源码与资料下载四.参考文章 一.课程介绍 一共14天课程(1)第一天:电商行业的背景.淘淘商城的介绍.搭建项目工程.Svn的使用.(2)第二天:框架的整合 ...

  9. 程序运行的cpu时间

    time.clock() 测量CPU时间,比较精准,通过比较程序运行前后的CPU时间差,得出程序运行的CPU时间.

  10. 多个图标图片(雪碧图)使用CSS样式显示

    现在的网页中显示很多图标算是常态,发现项目中页面上用到的图标都是单个图标单个文件,用的时候直接往页面上挂,这确实很常态. 如果,网站是挂在外网上,或者网速过低,又大量使用图标的情况下,由于浏览器和服务 ...