码迷,mamicode.com
首页 > 其他好文 > 详细

7 libjpeg使用

时间:2016-04-12 15:51:17      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:

一、交叉编译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_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     printf




static 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_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;
}

7 libjpeg使用

标签:

原文地址:http://www.cnblogs.com/CZM-/p/5382865.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!