zoukankan      html  css  js  c++  java
  • 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
    ", argv[1]);
            return -1;
        }
        jpeg_stdio_src(&cinfo, infile);
    
         // 用jpeg_read_header获得jpg信息
        jpeg_read_header(&cinfo, TRUE);
        /* 源信息 */
        printf("image_width    = %d
    ", cinfo.image_width);
        printf("image_height   = %d
    ", cinfo.image_height);
        printf("num_components = %d
    ", cinfo.num_components);
    
    
          // 设置解压参数,比如放大、缩小
    
        // 启动解压:jpeg_start_decompress
        jpeg_start_decompress(&cinfo);
    
        /* 输出的图像信息 */
        printf("output_width   = %d
    ", cinfo.output_width);
        printf("output_height  = %d
    ", cinfo.output_height);
        printf("output_components = %d
    ", 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
    ", FB_DEVICE_NAME);
        }
    
        ret = ioctl(g_fd, FBIOGET_VSCREENINFO, &g_tFBVar);
        if (ret < 0)
        {
            DBG_PRINTF("can't get fb's var
    ");
            return -1;
        }
    
        ret = ioctl(g_fd, FBIOGET_FSCREENINFO, &g_tFBFix);
        if (ret < 0)
        {
            DBG_PRINTF("can't get fb's fix
    ");
            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
    ");
            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
    ");
            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
    ", 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
    ", 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
    ", argv[1]);
            return -1;
        }
        jpeg_stdio_src(&cinfo, infile);
    
         // 用jpeg_read_header获得jpg信息
        jpeg_read_header(&cinfo, TRUE);
        /* 源信息 */
        printf("image_width    = %d
    ", cinfo.image_width);
        printf("image_height   = %d
    ", cinfo.image_height);
        printf("num_components = %d
    ", cinfo.num_components);
    
    
          // 设置解压参数,比如放大、缩小
          printf("enter M/N: 
    ");
        scanf("%d/%d", &cinfo.scale_num, &cinfo.scale_denom);
        printf("scale to : %d/%d
    ", cinfo.scale_num, cinfo.scale_denom);
    
        
        // 启动解压:jpeg_start_decompress
        jpeg_start_decompress(&cinfo);
    
        /* 输出的图像信息 */
        printf("output_width   = %d
    ", cinfo.output_width);
        printf("output_height  = %d
    ", cinfo.output_height);
        printf("output_components = %d
    ", 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;
    }
  • 相关阅读:
    堆排序算法的原理和实现
    图的深度优先搜索(DFS)和广度优先搜索(BFS)算法
    图的迪杰斯特拉算法求最短路径
    第13章 切换到混合流并添加API访问
    第12章 添加对外部认证的支持
    第11章 使用OpenID Connect添加用户身份验证
    第10章 使用密码保护API
    第9章 使用客户端凭据保护API
    第8章 概述
    第7章 贡献
  • 原文地址:https://www.cnblogs.com/CZM-/p/5382865.html
Copyright © 2011-2022 走看看