jpeg库下载地址:http://www.ijg.org/交叉编译三部曲:A ./configure --host=arm-linux-gcc --prefix=/home/flying/jpeg-installB  makeC  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_errorJPP((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   = 1cinfo.scale_denom = 27. 开始解压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

转载于:https://www.cnblogs.com/Focus-Flying/p/9279160.html

jpeg解码库使用实例相关推荐

  1. 嵌入式开发之Opencv(二)JPEG解码加速

    参考文档 libjpeg-turbo官网 libjpeg-turbo github主页 JPEG高速低画质选项设置 Speed-Up JPEG Encode/Decode Processing for ...

  2. pythonjpg_使用python判断jpeg图片的完整性实例

    用扩展名判断文件格式非常简单,但是有可能是错误的. jpeg文件有固定的文件头,其文件头的格式如下: Start Marker | JFIF Marker | Header Length | Iden ...

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

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

  4. centos php yum gd库,Centos7下PHP安装gd库的实例讲解

    Centos7下安装php, 或php的gd库支持,都是很简单的. 一切通过yum搞定. yum install php-gd 以上命令就搞定php-gd的支持,快快看看phpinfo是否支持了? 可 ...

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

    2019独角兽企业重金招聘Python工程师标准>>> <Emoji表情编解码库XXL-EMOJI> 一.简介 1.1 概述 XXL-EMOJI 是一个灵活可扩展的Emo ...

  6. angular模块库开发实例

    angular模块库开发实例 随着前端框架的诞生,也会随之出现一些组件库,方便日常业务开发.今天就聊聊angular4组件库开发流程. 下图是button组件的基础文件. nk-button.comp ...

  7. S3C6410 裸机硬件JPEG解码(转)

    源:S3C6410 裸机硬件JPEG解码 转载于:https://www.cnblogs.com/LittleTiger/p/4681864.html

  8. ffmpeg-0.8 开源编码解码库从linux下移植到windows vs2005

    最新 ffmpeg-0.8 开源编码解码库,从linux下移植到windows vs2005,全部开源. 需要 Intel C++ Compile 和 开源的SDL库支持,由于 Intel C++ C ...

  9. Javascript中Base64编码解码的使用实例

    Javascript为我们提供了一个简单的方法来实现字符串的Base64编码和解码,分别是window.btoa()函数和window.atob()函数. 1 var encodedStr = win ...

最新文章

  1. 如何在centos7下tomcat中安装https
  2. Elasticsearch使用
  3. ajaxFileUpload
  4. R12.1.3 R12.2.X 注册客户化应用
  5. CoreJava 5.3 泛型数组列表
  6. 常问面试题总结(JAVA基础篇)
  7. 杨薇天津大学计算机专业,高考志愿报得好,一生幸福少不了,遇到问题怎么办?静海一中校友来支招儿~...
  8. 数模笔记_多变量最优化的拉格朗日乘子方法中的灵敏性分析和影子价格
  9. Leetcode--438. 找到字符串中所有字母异位词
  10. mongo04---基本查询
  11. Oracle 11g常用管理命令(用户、表空间、权限)
  12. 电脑突然无法播放html音频,电脑无法播放音频怎么办
  13. zend studio 8使用感受
  14. 时序预测 | MATLAB实现DBN深度置信网络时间序列预测
  15. Ubuntu 截图工具
  16. java基础热门侠客养成_侠客养成手册攻略大全 新手攻略开局任务流程汇总[多图]...
  17. apk多开制作方法 试用ApkEditor 1.8 旗舰版轻松制作apk多开双开
  18. 华为m2青春版android7,时尚新体验:华为M2青春版
  19. android广播 有序 无序,Android全局广播(无序,有序)
  20. 打造高效敏捷的研发独立团 (2009年培训心得)

热门文章

  1. json序列化c语言,C语言JSON序列化/反序列化
  2. 总结JavaScript要点
  3. android 造成闪退原因,Smali聚合android4.4闪退问题原因及解决方案
  4. Ubuntu18.04 界面美化(mac风格)
  5. 中国高端护肤品牌林清轩数字化特色店于广州开幕
  6. Scrybe - 支持离线的在线日程/记事服务
  7. 详细了解为什么Postman Chrome应用程序突然不能用了?
  8. java word 写出_【转】java 读写word文档
  9. 魔兽世界不同账号同服务器邮寄,3.3:账号绑定物品可以邮寄给同服不同阵营角色...
  10. 计算机软件技术实习 迷宫游戏(一)