1. 程式人生 > >linux中jpeglib庫,【Linux開發】jpeglib使用指南

linux中jpeglib庫,【Linux開發】jpeglib使用指南

我覺得,你應該現在應該是libjpeg的dev沒有安裝. 檢視下是否已經安裝了,沒安裝的話,apt-get install libjpeg-dev

或者yum install -y libjpeg libjpeg-devel

您可以到www.ijg.org網站下載libjpeg的原始碼, IJG JPEG Library就是jpeg壓縮庫,是以原始碼的形式提供給軟體開發人員的,當然在軟體包裡也有編譯好的庫檔案,我們這裡就只用到其中的libjpeg.lib,jconfig.h,jmorecfg.h,jpeglib.h這幾個檔案,下面我就介紹一下怎樣在自己的程式裡嵌入影象壓縮功能。

  一、建立編譯環境

  所謂建立編譯環境,其實非常簡單,就是把上面提到的4個檔案拷貝到你的專案資料夾下,把libjpeg.lib新增到你的專案中,然後在你完成壓縮功能的那個檔案里加入#include "jpeglib.h",需要注意的是,libjpeg.lib是用c語言開發的,如果要用在你的C++程式裡,需要用到extern "C",如下:

// TestLibjpeg.cpp : Defines the entry point for the console application. //

#include "stdafx.h" #include "memory.h" extern "C" {  #include "jpeglib.h" }

  二、壓縮步驟

  1、申請並初始化jpeg壓縮物件,同時要指定錯誤處理器

 struct jpeg_compress_struct jcs;

 // 宣告錯誤處理器,並賦值給jcs.err域   struct jpeg_error_mgr jem;   jcs.err = jpeg_std_error(&jem);

  jpeg_create_compress(&jcs);

  2、指定壓縮後的影象所存放的目標檔案,注意,目標檔案應以二進位制模式開啟

 f=fopen("03.jpg","wb");   if (f==NULL)    {     delete [] data;     delete [] pDataConv;     return 0;   }   jpeg_stdio_dest(&jcs, f);

  3、設定壓縮引數,主要引數有影象寬、高、色彩通道數(1:索引影象,3:其他),色彩空間(JCS_GRAYSCALE表示灰度圖,JCS_RGB表示彩色影象),壓縮質量等,如下:

  jcs.image_width = nWidth;    // 為圖的寬和高,單位為畫素    jcs.image_height = nHeight;   jcs.input_components = 1;   // 在此為1,表示灰度圖, 如果是彩色點陣圖,則為3    jcs.in_color_space = JCS_GRAYSCALE; //JCS_GRAYSCALE表示灰度圖,JCS_RGB表示彩色影象

  jpeg_set_defaults(&jcs);   jpeg_set_quality (&jcs, 80, true);

需要注意的是,jpeg_set_defaults函式一定要等設定好影象寬、高、色彩通道數計色彩空間四個引數後才能呼叫,因為這個函式要用到這四個值,呼叫jpeg_set_defaults函式後,jpeglib庫採用預設的設定對影象進行壓縮,如果需要改變設定,如壓縮質量,呼叫這個函式後,可以呼叫其它設定函式,如jpeg_set_quality函式。其實影象壓縮時有好多引數可以設定,但大部分我們都用不著設定,只需呼叫jpeg_set_defaults函式值為預設值即可。

  4、上面的工作準備完成後,就可以壓縮了,壓縮過程非常簡單,首先呼叫jpeg_start_compress,然後可以對每一行進行壓縮,也可以對若干行進行壓縮,甚至可以對整個的影象進行一次壓縮,壓縮完成後,記得要呼叫jpeg_finish_compress函式,如下:

  jpeg_start_compress(&jcs, TRUE);

  JSAMPROW row_pointer[1];   // 一行點陣圖   int row_stride;      // 每一行的位元組數

  row_stride = jcs.image_width;  // 如果不是索引圖,此處需要乘以3

  // 對每一行進行壓縮   while (jcs.next_scanline < jcs.image_height) {        row_pointer[0] = & pDataConv[jcs.next_scanline * row_stride];        jpeg_write_scanlines(&jcs, row_pointer, 1);   }

  jpeg_finish_compress(&jcs);

  5、最後就是釋放壓縮工作過程中所申請的資源了,主要就是jpeg壓縮物件,由於在本例中我是直接用的區域性變數,所以只需呼叫jpeg_destroy_compress這個函式即可,如下:

 jpeg_destroy_compress(&jcs);

  三、解壓縮步驟   解壓縮步驟與壓縮步驟非常相似,只是解壓縮物件為jpeg_decompress_struct型別,步驟如下:   1、宣告並初始化解壓縮物件,同時制定錯誤資訊管理器  struct jpeg_decompress_struct cinfo;  struct jpeg_error_mgr jerr;

 cinfo.err = jpeg_std_error(&jerr);  jpeg_create_decompress(&cinfo);   2、開啟jpg影象檔案,並指定為解壓縮物件的原始檔  FILE *f = fopen(strSourceFileName,"rb");  if (f==NULL)  {   printf("Open file error!/n");   return;  }  //   jpeg_stdio_src(&cinfo, f);   3、讀取影象資訊  jpeg_read_header(&cinfo, TRUE);   4、根據影象資訊申請一個影象緩衝區  data = new BYTE cinfo.image_width*cinfo.image_height*cinfo.num_components];   5、開始解壓縮  jpeg_start_decompress(&cinfo);

 JSAMPROW row_pointer[1];  while (cinfo.output_scanline < cinfo.output_height)  {   row_pointer[0] = &data[(cinfo.output_height - cinfo.output_scanline-1)*cinfo.image_width*cinfo.num_components];   jpeg_read_scanlines(&cinfo,row_pointer ,      1);  }  jpeg_finish_decompress(&cinfo);   6、釋放資源  jpeg_destroy_decompress(&cinfo);

 fclose(f);

  好了,利用IJG JPEG Library進行影象壓縮就介紹到這裡,希望對大家有所幫助,例項程式碼已經實現了影象的壓縮和解壓縮的全部功能