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進行影象壓縮就介紹到這裡,希望對大家有所幫助,例項程式碼已經實現了影象的壓縮和解壓縮的全部功能