你的位置:首页 > 操作系统

[操作系统]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_decompresswhile (scan lines remain to be read)  jpeg_read_scanlines(...);              // 循环调用jpeg_read_scanlinesjpeg_finish_decompress(...);              // jpeg_finish_decompressRelease 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_decompress  jpeg_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_decompresswhile (scan lines remain to be read)  jpeg_read_scanlines(...);              // 循环调用jpeg_read_scanlinesjpeg_finish_decompress(...);              // jpeg_finish_decompressRelease 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_decompress  jpeg_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;}