首页 > 编程知识 正文

libjpeg,libjpeg.so

时间:2023-05-06 10:09:51 阅读:229231 作者:2361

1) 开发环境

内核版本: Linux-2.6.22

freetype版本: libjpeg-turbo-1.2.1

gcc版本: gcc-3.4.5


2) 步骤

1. 解压缩       tar  xjf  libjpeg-turbo-1.2.1.tar.bz2

2. 配置          ./configure  --host=arm-linux  --prefix=自定义安装目录

3. 编译安装   make  install

    注意: 安装完后会将libjpeg的头文件和库文件安装到自定义安装目录下如下图


4. 测试用例

    为了避免编译时指定各个参数现在将生成的头文件和库文件拷贝到交叉工具链中,首先进入头文件所在目录并执行命令

           cp  *   /opt/cross-tools/gcc-3.4.5-glibc-2.3.6/arm-linux/include

     然后进入库文件所在目录并执行如下命令

           cp  *  /opt/cross-tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib  -d

     同时将动态库拷贝到文件系统中

           cp  *so*  /nfs/sysfs/fs_s3c2440/lib  -d

      jpg2rgb.c源文件如下:

#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>#include <stdlib.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 %sn", FB_DEVICE_NAME);}ret = ioctl(g_fd, FBIOGET_VSCREENINFO, &g_tFBVar);if (ret < 0){DBG_PRINTF("can't get fb's varn");return -1;}ret = ioctl(g_fd, FBIOGET_FSCREENINFO, &g_tFBFix);if (ret < 0){DBG_PRINTF("can't get fb's fixn");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 mmapn");return -1;}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 regionn");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;*pdwFB32bpp |= 0xff000000;break;}default :{DBG_PRINTF("can't support %d bppn", 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 bppn", 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;}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 (argc != 2){printf("Usage: n");printf("%s <jpg_file>n", argv[0]);return -1;}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 %sn", argv[1]);return -1;}jpeg_stdio_src(&cinfo, infile); //用jpeg_read_header获取jpg信息jpeg_read_header(&cinfo, TRUE);printf("image_width = %dn", cinfo.image_width);printf("image_height = %dn", cinfo.image_height);printf("num_components = %dn", cinfo.num_components); //设置解压参数,比如放大、缩小printf("enter scale M/N:n");scanf("%d/%d", &cinfo.scale_num, &cinfo.scale_denom);printf("scale to : %d/%dn", cinfo.scale_num, cinfo.scale_denom); //启动解压jpeg_start_decompress(&cinfo);printf("output_width = %dn", cinfo.output_width);printf("output_height = %dn", cinfo.output_height);printf("output_components = %dn", 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);} //Release the JPEG decompression objectfree(buffer);jpeg_finish_decompress(&cinfo);jpeg_destroy_decompress(&cinfo);close(g_fd);return 0;}运行:  ./jpeg2rgb  1.jpg

    编译测试文件jpg2rgb.c       arm-linux-gcc  jpg2rgb.c  -o  jpg2rgb  -ljpeg

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。