7 libjpeg使用

来源:http://www.cnblogs.com/CZM-/archive/2016/04/12/5382865.html
-Advertisement-
Play Games

一、交叉編譯libjepg編譯 tar xzf libjpeg-turbo-1.2.1.tar.gz ./configure –help ./configure --prefix=/work/project/first_project/13libjepg/libjpeg-turbo-1.2.1/tm... ...


一、交叉編譯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;
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Range --創建分區表 create table emp3(id number(4) primary key,name varchar2(20),eff_dt date) partition by range(eff_dt) ( partition p1 values less than (to ...
  • 1. 參考文檔 http://xuwensong.elastos.org/2014/01/13/ubuntu-%E4%B8%8Bmysql-cluster%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE/ 2. 簡介 MySQL-Cluster是一種技術,該 ...
  • 1.架構圖 註意 (一) Mysql需要把bind-address的配置去掉,否則無法實現虛擬ip訪問 (二) 關閉所有linux防火牆:/sbin/iptables –F(可能沒用) (三) 重啟networking:sudo /etc/init.d/networking restart(可能沒用 ...
  • 本文由ilanniweb提供友情贊助,首發於爛泥行天下 想要獲得更多的文章,可以關註我的微信ilanniweb 昨天把nginx的日誌進行了切割,關於如何切割nginx日誌,可以查看《爛泥:切割nginx日誌》這篇文章。 今天打算分析下nginx日誌,要分析nginx日誌,我們可以通過shell腳本... ...
  • 通過MySQL參數配置使用主主前提: 1、表的主鍵自增。 ################################################################# #m1-m2配置文件更改:再上篇M-S同步基礎上增加: ########################### ...
  • lkmnb ...
  • 操作步驟: 1.sudo apt-get autoremove(卸載系統中所有未被使用的依賴關係) 2.sudo apt-get clean(清除所有緩存的包文件) 以上操作綠色無害,對系統無影響。 ...
  • 方法一: 操作步驟:進入cmd命令界面-->輸入:net use(查看列表)-->輸入:net use * /delete(清空列表)-->輸入:y 回車確認即可。 註意:操作後仍然無法解決,可嘗試註銷系統。若註銷後仍是不行,請嘗試第二種方法。 方法二: 操作步驟:控制面板-->用戶賬戶-->選擇:... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...