天天看點

在VS2010下編譯libjpeg及其應用例子

下載下傳到libjpeg源碼後,解壓,可以看到很多文檔,想在VS2010中編輯使用,主要參考檔案:install.txt

在字段Microsoft Windows, Microsoft Visual C++ 2010 Developer Studio (v10):下的部分有詳細說明。

1、使用vs2010工程編譯

下面是我參考了說明文檔以及網上一些資料後的編譯過程:

編譯過程:

1,下載下傳libjpeg的源代碼  下載下傳位址:http://www.ijg.org/  我下載下傳到的是jpegsr8d.zip

2、解壓出來一堆檔案,打開指令行視窗(CMD),進入代碼所放的目錄下

如源碼所在目錄為E:\jpeg-8d  則在指令行輸入E: 回車,再輸入cd jpeg-8d  ,cd就是進入檔案夾的意思。

3、運作指令:NMAKE /f makefile.vc  setup-v10 回車開始編譯,然後問題就來了:

  “nmake 不是内部或外部指令”

      原因:沒有安裝vc或者沒有選擇環境變量。 

解決方法:安裝vc或vs,并選擇環境變量;按以下方法設定: 【根據VS2010的實際安裝路徑設定】

    . 在我的電腦 > 屬性 > 進階 > 環境變量中設定“include”“lib”“path”變量的值, 如果沒有這三個變量,就建立變量,如果有,就在目前的值後邊添加以下值,值之間用分号隔開。

    . include:D:\Program Files\Microsoft Visual Studio 10.0\VC\include\ 

    . lib:D:\Program Files\Microsoft Visual Studio 10.0\VC\lib\ 

    . 找到Microsoft Visual Studio .NET\Vc7\bin\cl.exe的動态連結庫mspdb70.dll, 将mspdb70.dll的路徑加入到

  path的值:D:\Program Files\Microsoft Visual Studio 10.0\VC\bin

    設定好後再次運作指令:NMAKE /f makefile.vc  setup-v10 回車

5、又出現問題: “file 'win32.mak' not found”

      提示找不到win32.mak檔案,這個檔案定義了一些必須的宏,這個檔案在Windows SDK的安裝目錄中,打開makefile.vc檔案修改第12行為:

    !include <C:/Program Files/Microsoft SDKs/Windows/v6.0A/Include/win32.mak>

      儲存,再執行上述指令。

(有些人編譯到此還會繼續出現錯誤,見本文下方引用的其他解決辦法。)

運作結果如下:

在VS2010下編譯libjpeg及其應用例子
在VS2010下編譯libjpeg及其應用例子

Microsoft (R) Program Maintenance Utility Version 10.00.30319.01

在VS2010下編譯libjpeg及其應用例子

Copyright (C) Microsoft Corporation.  All rights reserved.

在VS2010下編譯libjpeg及其應用例子
在VS2010下編譯libjpeg及其應用例子

        ren jconfig.vc jconfig.h

在VS2010下編譯libjpeg及其應用例子

        ren makejsln.v10 jpeg.sln

在VS2010下編譯libjpeg及其應用例子

        ren makeasln.v10 apps.sln

在VS2010下編譯libjpeg及其應用例子

        ren makejvcx.v10 jpeg.vcxproj

在VS2010下編譯libjpeg及其應用例子

        ren makejfil.v10 jpeg.vcxproj.filters

在VS2010下編譯libjpeg及其應用例子

        ren makecvcx.v10 cjpeg.vcxproj

在VS2010下編譯libjpeg及其應用例子

        ren makecfil.v10 cjpeg.vcxproj.filters

在VS2010下編譯libjpeg及其應用例子

        ren makedvcx.v10 djpeg.vcxproj

在VS2010下編譯libjpeg及其應用例子

        ren makedfil.v10 djpeg.vcxproj.filters

在VS2010下編譯libjpeg及其應用例子

        ren maketvcx.v10 jpegtran.vcxproj

在VS2010下編譯libjpeg及其應用例子

        ren maketfil.v10 jpegtran.vcxproj.filters

在VS2010下編譯libjpeg及其應用例子

        ren makervcx.v10 rdjpgcom.vcxproj

在VS2010下編譯libjpeg及其應用例子

        ren makerfil.v10 rdjpgcom.vcxproj.filters

在VS2010下編譯libjpeg及其應用例子

        ren makewvcx.v10 wrjpgcom.vcxproj

在VS2010下編譯libjpeg及其應用例子

        ren makewfil.v10 wrjpgcom.vcxproj.filters

然後打開jpeg.sln,直接編譯就ok了.

2、使用建構工具直接編譯

編譯步驟:

1、添加環境變量PATH:C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin

2、解壓jpegsrc.v8c.tar.gz,得到jpeg-8c

3、修改源代碼中jconfig.vc為jconfig.h

4、修改makefile.vc,将Pull in standard variable definitions下面的一行換為

!include <C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Include\Win32.Mak>

 預設生成 lib

若要生成dll仍需要修改

在all:libjpeg.lib 中添加dll的編譯

 libjpeg.dll: $(LIBOBJECTS)

 $(RM) libjpeg.dll

 link -dll -out:libjpeg.dll  $(LIBOBJECTS)

5、生成指令

vcvars32

nmake /f makefile.vc nodebug=1

測試程式:

1,在測試程式中工程屬性-Linker-Input-Additional Dependencies中添加編譯得到的jpeg.lib,同時将jpeg.lib檔案放在測試代碼同級目錄下;

2,将libjpeg包中的頭檔案放在測試程式目錄下,并在測試程式中添加對jpeglib.h和jmorecfg.h的引用(#include)。

即可在測試程式用用libjpeg庫生成jpeg圖像。

測試代碼例子

int _tmain(int argc, _TCHAR* argv[])
{
	//定義一個壓縮對象,這個對象用于處理主要的功能
	jpeg_compress_struct jpeg;
	//用于錯誤資訊
	jpeg_error_mgr jerr;
	//錯誤輸出在綁定
	jpeg.err = jpeg_std_error(&jerr);
 
	//初始化壓縮對象
	jpeg_create_compress(&jpeg);
	//定義壓縮後的輸出,這裡輸出到一個檔案!
	FILE* pFile = fopen( "c:\\tt.jpeg","wb" );
	if( !pFile )
		return 0;
	//綁定輸出
	jpeg_stdio_dest(&jpeg, pFile);
	//壓縮參數設定。具體請到網上找相應的文檔吧,參數很多,這裡隻設定主要的。
	//我設定為一個 24 位的 512 X 512大小的RGB圖檔
	jpeg.image_width = 512;
	jpeg.image_height = 512;
	jpeg.input_components  = 3;
	jpeg.in_color_space = JCS_RGB;
	//參數設定為預設的
	jpeg_set_defaults(&jpeg);      
//還可以設定些其他參數:      
 指定亮度及色度品質
	//jpeg.q_scale_factor[0] = jpeg_quality_scaling(100);
	//jpeg.q_scale_factor[1] = jpeg_quality_scaling(100);
	 圖像采樣率,預設為2 * 2
	//jpeg.comp_info[0].v_samp_factor = 1;
	//jpeg.comp_info[0].h_samp_factor = 1;
	 設定編碼jpeg壓縮品質
	//jpeg_set_quality (&jpeg, 100, true);
      
//開始壓縮。執行這一行資料後,無法再設定參數了!
	jpeg_start_compress(&jpeg, TRUE);
	//定義一個數組,代表圖檔每一行的資料。3 代表 jpeg.input_components
	unsigned char oneRowImgData[ 512 * 3 ];
	for( int i=0;i<512*3;++i )
		oneRowImgData[i] = 0;
 
	JSAMPROW row_pointer[1];
	row_pointer[0] = oneRowImgData;
	//從上到下,設定圖檔中每一行的像素值
	for( int i=0;i<jpeg.image_height;++i )
	{
		int data = 0;
		for (int j = 0;j<jpeg.image_width*3;j=j+3)
		{
			oneRowImgData[j] = data%255;//R
			//oneRowImgData[j+1] = data%255;//G
			//oneRowImgData[j+2] = data%255;//B
			data ++;
		}

      
//将一行資料寫入!
		jpeg_write_scanlines( &jpeg,row_pointer,1 );
	}
	//結束壓縮
	jpeg_finish_compress(&jpeg);
	//清空對象
	jpeg_destroy_compress(&jpeg);
 
	fclose( pFile ); pFile = NULL;
	return 0;
      
}
      

執行完畢後,會在C槽根目錄下生成一個名為tt.jpeg的圖檔。

繼續閱讀