7 libjpeg使用

一、交叉编译libjepg编译

tar xzf libjpeg-turbo-1.2.1.tar.gz

./configure –help

./configure --prefix=/work/project/first_project/13libjepg/libjpeg-turbo-1.2.1/tmp/  --host=arm-linux

make

make install

二、交叉编译jepg2rgb.c

arm-linux-gcc -o jpg2rgb jpg2rgb.c  -I /work/project/first_project/13libjepg/libjpeg-turbo-1.2.1/tmp/include/ -L /work/project/first_project/13libjepg/libjpeg-turbo-1.2.1/tmp/lib/ –ljpeg

把库考到开发板上

cp ../libjpeg-turbo-1.2.1/tmp/lib/*so* /work/nfs_root/fs_mini_mdev/lib/

 

编译出来的头文件应该放入:
cd /work/project/first_project/13libjepg/libjpeg-turbo-1.2.1/tmp/include

cp *  /work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/include  -rf

 

编译出来的库文件应该放入:
cd /work/project/first_project/13libjepg/libjpeg-turbo-1.2.1/tmp/lib

sudo cp * /work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib -d –rf

 

现在不需要指定目录

arm-linux-gcc -o jpg2rgb jpg2rgb.c –ljpeg

 

1th输出源文件信息,及解压后信息

#include <stdio.h>
#include "jpeglib.h"
#include <setjmp.h>/*
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结构体
*//* Uage: jpg2rgb <jpg_file>*/int main(int argc, char **argv)
{struct jpeg_decompress_struct cinfo;struct jpeg_error_mgr jerr;FILE * infile;// 分配和初始化一个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);// 设置解压参数,比如放大、缩小// 启动解压:jpeg_start_decompressjpeg_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);// 循环调用jpeg_read_scanlines一行一行的获得解压数据
jpeg_finish_decompress(&cinfo);jpeg_destroy_decompress(&cinfo);return 0;
}

 

使用LCD输出

#include <stdio.h>
#include "jpeglib.h"
#include <setjmp.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <linux/fb.h>
#include <string.h>#define FB_DEVICE_NAME "/dev/fb0"
#define DBG_PRINTF     printfstatic int g_fd;static struct fb_var_screeninfo g_tFBVar;
static struct fb_fix_screeninfo g_tFBFix;            
static unsigned char *g_pucFBMem;
static unsigned int g_dwScreenSize;static unsigned int g_dwLineWidth;
static unsigned int g_dwPixelWidth;static int FBDeviceInit(void)
{int ret;g_fd = open(FB_DEVICE_NAME, O_RDWR);if (0 > g_fd){DBG_PRINTF("can't open %s\n", FB_DEVICE_NAME);}ret = ioctl(g_fd, FBIOGET_VSCREENINFO, &g_tFBVar);if (ret < 0){DBG_PRINTF("can't get fb's var\n");return -1;}ret = ioctl(g_fd, FBIOGET_FSCREENINFO, &g_tFBFix);if (ret < 0){DBG_PRINTF("can't get fb's fix\n");return -1;}g_dwScreenSize = g_tFBVar.xres * g_tFBVar.yres * g_tFBVar.bits_per_pixel / 8;g_pucFBMem = (unsigned char *)mmap(NULL , g_dwScreenSize, PROT_READ | PROT_WRITE, MAP_SHARED, g_fd, 0);if (0 > g_pucFBMem)    {DBG_PRINTF("can't mmap\n");return -1;}
/*g_tFBOpr.iXres       = g_tFBVar.xres;g_tFBOpr.iYres       = g_tFBVar.yres;g_tFBOpr.iBpp        = g_tFBVar.bits_per_pixel;
*/g_dwLineWidth  = g_tFBVar.xres * g_tFBVar.bits_per_pixel / 8;g_dwPixelWidth = g_tFBVar.bits_per_pixel / 8;return 0;
}static int FBShowPixel(int iX, int iY, unsigned int dwColor)
{unsigned char *pucFB;unsigned short *pwFB16bpp;unsigned int *pdwFB32bpp;unsigned short wColor16bpp; /* 565 */int iRed;int iGreen;int iBlue;if ((iX >= g_tFBVar.xres) || (iY >= g_tFBVar.yres)){DBG_PRINTF("out of region\n");return -1;}pucFB      = g_pucFBMem + g_dwLineWidth * iY + g_dwPixelWidth * iX;pwFB16bpp  = (unsigned short *)pucFB;pdwFB32bpp = (unsigned int *)pucFB;switch (g_tFBVar.bits_per_pixel){case 8:{*pucFB = (unsigned char)dwColor;break;}case 16:{iRed   = (dwColor >> (16+3)) & 0x1f;iGreen = (dwColor >> (8+2)) & 0x3f;iBlue  = (dwColor >> 3) & 0x1f;wColor16bpp = (iRed << 11) | (iGreen << 5) | iBlue;*pwFB16bpp    = wColor16bpp;break;}case 32:{*pdwFB32bpp = dwColor;break;}default :{DBG_PRINTF("can't support %d bpp\n", g_tFBVar.bits_per_pixel);return -1;}}return 0;
}static int FBCleanScreen(unsigned int dwBackColor)
{unsigned char *pucFB;unsigned short *pwFB16bpp;unsigned int *pdwFB32bpp;unsigned short wColor16bpp; /* 565 */int iRed;int iGreen;int iBlue;int i = 0;pucFB      = g_pucFBMem;pwFB16bpp  = (unsigned short *)pucFB;pdwFB32bpp = (unsigned int *)pucFB;switch (g_tFBVar.bits_per_pixel){case 8:{memset(g_pucFBMem, dwBackColor, g_dwScreenSize);break;}case 16:{iRed   = (dwBackColor >> (16+3)) & 0x1f;iGreen = (dwBackColor >> (8+2)) & 0x3f;iBlue  = (dwBackColor >> 3) & 0x1f;wColor16bpp = (iRed << 11) | (iGreen << 5) | iBlue;while (i < g_dwScreenSize){*pwFB16bpp    = wColor16bpp;pwFB16bpp++;i += 2;}break;}case 32:{while (i < g_dwScreenSize){*pdwFB32bpp    = dwBackColor;pdwFB32bpp++;i += 4;}break;}default :{DBG_PRINTF("can't support %d bpp\n", g_tFBVar.bits_per_pixel);return -1;}}return 0;
}static int FBShowline(int iXStart, int iXEnd, int iY, unsigned char *pucRGBArray)
{int i = iXStart * 3;    //每个像素占据三个字节int iX;unsigned int dwColor;if(iY >= g_tFBVar.yres)return -1;if(iXStart>= g_tFBVar.xres)return -1;if((iXEnd >= g_tFBVar.xres)){iXEnd = g_tFBVar.xres;    }for(iX = iXStart; iX < iXEnd; iX++){/* 0xRRGGBB */dwColor = (pucRGBArray[i] << 16 ) + (pucRGBArray[i + 1] << 8) + (pucRGBArray[i + 2] << 0);i += 3;FBShowPixel(iX, iY, dwColor);}return 0;
}/*
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结构体
*//* Uage: jpg2rgb <jpg_file>*/int main(int argc, char **argv)
{struct jpeg_decompress_struct cinfo;struct jpeg_error_mgr jerr;FILE * infile;int  row_stride; unsigned char *buffer;if(FBDeviceInit()){return -1;}FBCleanScreen(0);// 分配和初始化一个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);// 设置解压参数,比如放大、缩小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_decompressjpeg_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去FBShowline(0, cinfo.output_width, cinfo.output_scanline, buffer);}free(buffer);jpeg_finish_decompress(&cinfo);jpeg_destroy_decompress(&cinfo);return 0;
}

转载于:https://www.cnblogs.com/CZM-/p/5382865.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543444.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle快速排序法,经典算法系列之快速排序算法

快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。在平均状况下&#xff0c;排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较&#xff0c;但这种状况并不常见。事实上&#xff0c;快速排序通常明显比其他Ο(n log n) 算法更快&am…

echaer 地图_ECharts地图系列

series[i]-map用于控制 ECharts 中的地图。地图主要用于地理区域数据的可视化&#xff0c;配合 visualMap 组件用于展示不同区域的人口分布密度等数据。多个地图类型相同的系列会在同一地图上显示&#xff0c;这时候使用第一个系列的配置项作为地图绘制的配置。Tip: 在 ECharts…

内核电源管理器已启动关机转换_电气器件-菲尼克斯UPS(不间断电源)使用

在有些项目中存在部分器件不允许突然失电的情况&#xff0c;否则会导致器件损坏或者生产产品损坏等问题。为解决该问题一般使用UPS(不间断电源)来解决该问题。下面简单介绍菲尼克斯UPS的使用。某项目中使用工控机进行设备参数的管理、编辑操作&#xff0c;系统为Win7&#xff0…

关于JAVA中的synchronized,一段不错的解释...

转载于:https://www.cnblogs.com/tabchanj/p/5387832.html

oracle11优点,争先体味Oracle 11g的新特点

争先体味Oracle 11g的新特点跟着这几天Oracle OpenWorld大会的举行&#xff0c;Oracle11g的新特征越来越多的被展现出来。以前&#xff0c;我曾经引见过Oracle11g将可能在10月份的这个大会上推出&#xff0c;当初至于Alpha版的信息已经可以见到&#xff0c;现时出现的已经是Bet…

l298n电机驱动模块使用方法_SPDK virtio 驱动模块介绍及使用

作者简介闫亮 Intel高级软件工程师专注于开源存储SPDK的测试和优化简介CONTENTSSPDK virtio模块介绍SPDK virtio 用户模式使用示例SPDK virtio PCI模式使用示例总结第一章SPDK virtio模块介绍众所周知&#xff0c;Virtio协议定义了两个块设备驱动&#xff0c;virtio-blk和vi…

【rman】list archivelog all与list backup of archivelog all

list archivelog all 是列出控制文件中记录的未被rman delete 命令删除的手工删除的日志文件&#xff0c;如果手工删除之后使用list命令对应的日志文件的status为标记为X&#xff01;模拟删除日志yangdb_1_192_762800109.log oraclerac3:/opt/oracle/yangdb_arch>mv yangdb_…

ase支持 urp不_urp管线的自学hlsl之路 第一篇 序言

入坑unity学习已经有一年半了&#xff0c;shader很早就在用连连看学习和使用(lwrp hdrp的shadergraph和build in的ase)。但是随着对于画质和效果的追求和提高&#xff0c;使用手写shader已经变得非常有必要了。疫情期间正好打下了C#的编程基础&#xff0c;两个月前我开始学习CG…

oracle变量名,Oracle中的替换变量,变量名,变量名

替换变量(仅用于SQL *Plus或者用于原理和SQL *Plus相同的开发工具)&#xff1a;临时存储值利用它可以达到创建通用脚本的目的利用它可以达到和用户交互&#xff0c;故在SQL *Plus中又称交互式命令替换变量的格式式在变量名称前加一个&&#xff0c;以便在运行SQL命令时提示用…

2 使用_索尼黑卡RX100M6的使用指南2

索尼黑卡RX100M6的使用指南2先说刚拿到黑卡怎么上手吧&#xff0c;每次就谈3个点。NO.1模式转盘如下图模式转盘HFR&#xff1a;拍摄慢动作(视频)的档位&#xff0c;黑卡最高拍摄40倍慢动作视频&#xff1b;SCN&#xff1a;情景模式&#xff0c;就是小白不知道什么题材设置什么参…

iOS中的UIScrollView(滑动视图)

2019独角兽企业重金招聘Python工程师标准>>> UIScrollView 可以滑动的视图 #import "ViewController.h"interface ViewController (){UIImageView *imgV;}endimplementation ViewController- (void)viewDidLoad {[super viewDidLoad];//新加一个UIScroll…

linux文件什么权限比较安全,linux文件安全与权限

文件文件类型创建文件改变权限位符号模式r w x&#xff1a;文件属主权限 这是前面三位r- x&#xff1a;同组用户权限 这是中间三位r- x&#xff1a;其他用户权限 这是最后三位chmod命令的一般格式为&#xff1a;chmod [who] operator [permission] filenamewho的含义是&#xf…

系统新模块增加需要哪些步骤_在1769系统里使用MVI69MCM的有福了

如果在AB的1769系统里需要走Modbus RTU通讯的话就需要Prosoft的1769系列的机架式产品&#xff0c;之前的项目用的是老型号MVI69-MCM&#xff0c;那么新项目就会用MVI69E-MBS这个型号。那么模块的通讯拓扑图如下所示&#xff1a;模块往下可以连接仪表&#xff0c;变频器&#xf…

大脑使用书全6册有用吗_常锻炼“人体第二大脑”的孩子,不仅智商高,记忆力也很强...

常锻炼“人体第二大脑”的孩子&#xff0c;不仅智商高&#xff0c;记忆力也很强父母都希望自己的孩子聪明、智商高&#xff0c;很多家长也会将精力投入到孩子大脑潜能开发中。也有一些家长会说&#xff0c;聪不聪明那是天生的&#xff0c;一些家庭明明对于孩子大脑开发的事情不…

Apache多站点配置详解

2019独角兽企业重金招聘Python工程师标准>>> 本人第一篇技术博客&#xff0c;主要是把我自己的笔记做一个整理&#xff0c;并对之前学习做一个回顾和总结&#xff0c;也分享给大家&#xff0c;共同提高&#xff0c;好了&#xff0c;闲话少说&#xff0c;进入正题吧。…

linux字符设备驱动在哪里设置,从点一个灯开始学写Linux字符设备驱动!

原标题&#xff1a;从点一个灯开始学写Linux字符设备驱动&#xff01;[导读] 前一篇文章&#xff0c;介绍了如何将一个hello word模块编译进内核或者编译为动态加载内核模块&#xff0c;本篇来介绍一下如何利用Linux驱动模型来完成一个LED灯设备驱动。点一个灯有什么好谈呢&…

ipv6 ospf配置方法_【思唯网络学院】网络故障大全及处理原理和方法

第一章 故障处理方法一、网络的复杂性   一般网络包括路由、拨号、交换、视频、WAN(ISDN、帧中继、ATM、…)、LAN、VLAN、… 二、故障处理模型   1、 界定问题(Define the Problem)   详细而精确地描述故障的症状和潜在的原因   2、 收集详细信息(Gather Facts)R>信…

怎么让模糊的数字变清楚_一键模糊图像变清晰,好家伙!这款神器插件你值得拥有...

让我们结伴&#xff0c;走进设计好家伙&#xff0c;最近有设计师朋友给我反映很多问题!其中吐槽最多的就是甲方给图不够清晰整个模特&#xff0c;产品都有种朦胧美我擦嘞&#xff0c;导入到软件作图放大后&#xff0c;像素啥都看不清有木有~&#xff01;&#xff01;找老板要清…

服务器安全问题处理

linux 安全加固设置 今天收到阿里云的邮件&#xff0c;一台linux服务器在荷兰被登录了。9.23分。我赶紧进去修改了下密码&#xff0c; 由于本公司又没专门的安全工程师&#xff0c;运维都是副业&#xff0c;主业都是开发&#xff0c;所以有些无可赖何&#xff0c;我进去把平常看…

vscode php插件_JS之 提高开发效率的Visual Studio Code插件

阅读本文约需要9分钟大家好&#xff0c;我是你们的导师&#xff0c;我每天都会在这里给大家分享一些干货内容(当然了&#xff0c;周末也要允许老师休息一下哈)。上次老师跟大家分享了JS之 小技巧的知识&#xff0c;今天跟大家分享下JS之 提高开发效率的Visual Studio Code插件的…