天天看點

不同格式圖檔互相轉換的開源庫分享

一、背景

筆者在項目的開發中,需要調用windows下的COM接口SetIconLocation來實作桌面快捷方式。而我們項目中給定的圖檔格式為png格式,SetIconLocation的接口第一個參數指定必須包含icon(即.ico)類型圖示的exe或dll檔案或直接是ico檔案路徑。網上查了好久,沒有直接調用png實作快捷方式的接口,但網上格式間互相轉換的工具也是很多的(工具需要手動拖選實作,這點項目中也是不允許的)。是以,問題就轉嫁為:如何實作png格式圖示轉化為ico格式圖示?

SetIconLocation的MSDN釋義如下:
SetIconLocation Method
       Sets the location ofthe link's icon.
      object.SetIconLocation(sPath,iIndex)
Parameters
      【1】sPath Required. String value that contains the fully qualified path of the file that contains the icon.
      【2】iIndex Required. Integer that is set to the index of the icon in the file specified bysPath.           

二、思考的解決方案

自己用windowsAPI實作png轉ico,筆者看到ico轉png的源碼大緻是需要GDI的Bitmap類中轉,實作比較複雜,且過程不具有可逆性。即靠接口實作有一定難度。

這個時候想到,既然網上有那麼多工具,是不是也有開源庫的實作?于是就有了CxImage類庫的發現與使用。參見:

http://www.codeproject.com/Articles/1300/CxImage

三、CxImage類庫的功能

CxImage是一個可以用于MFC的C++類庫(其工程是用dsw格式,vc6.0可以打開使用),其可以打開,儲存,顯示,轉換各種格式的圖像檔案,比如BMP, JPEG, GIF, PNG, TIFF, MNG,ICO, PCX, TGA, WMF, WBMP, JBG, J2K 等格式的檔案。具體支援格式、定義、需要的庫及大小如下:

四、CxImage類庫的使用

Step1:下載下傳文檔後,用VC6打開,編譯運作工程下面包含的子工程,以生成我們需要的庫如png.lib等。工程為節省空間,預設是沒有編譯過的。

Step2:在VC的編譯選項中做如下設定

1)ProjectSetting--> C/C++-->CodeGeneration-->Use run-time library : MultithreadedDLL (must be the same for all the linked libraries);

2)ProjectSetting--> C/C++--> Precompiledheaders—> not using precompiled headers; 如果需要包含的話,手動在添加進工程的Cximage源碼的每個.cpp和.h檔案中加入#include也沒有問題(筆者已經試驗過)。

3)ProjectSetting--> C/C++--> Preprocessor—> AdditionalInclude Directories:  ..cximage,即包含進去我們需要添加的目錄名稱,以便後續工程中包含頭檔案,無需寫檔案路徑。

4)ProjectSetting-->Link—>General-->Object/library modules--> png.lib libdcr.lib jpeg.lib zlib.lib tiff.lib jasper.libcximage.lib. 這個我們根據我們的實作功能包含不同的lib檔案即可。

Step3:在所有的源碼實作中必須包含: #include "ximage.h

五、單元測試CxImage類庫的使用

以下測試不同格式轉換的實作,分别為bmp轉為jpg源碼,以及ico轉為png源碼。筆者已經測試過,沒有問題。如果不放心,可以對每個函數加上傳回值判定。

CxImage  image;
// bmp -> jpg
image.Load("image.bmp",CXIMAGE_FORMAT_BMP);
if (image.IsValid())
{
If (!image.IsGrayScale())
{
       image.IncreaseBpp(24);
}
    image.SetJpegQuality(80);
    image.Save("image.jpg",CXIMAGE_FORMAT_JPG);
}
 
// ico -> png
image.Load("image.png",CXIMAGE_FORMAT_ICO);
if (image.IsValid())
{
    image.Save("image.tif",CXIMAGE_FORMAT_PNG);
}           

其餘的CxImage類庫的資訊(版權、版本、曆史、功能細節、下載下傳)等大家可以網絡搜尋。如果你正在為不同格式類型轉化的代碼犯愁,不妨試一下CxImage類庫!

六、個人總結

對于自己短期内要快速實作的功能,而個人能力和時間有限的情況下,可以考慮借助網絡開源的實作,個人總結需要以下幾個步驟:

Step1:網絡上搜尋關鍵詞,看有沒有開源的實作。如ico轉化為png或者png convert to ico。

Step2:如果有開源實作,則研究其對應文檔了解其主要功能。最主要的是,研究其是否包含你所需要的功能?如果沒有直接包含,思考轉換下後看能否滿足需求。

Step3:如果能基本包含我們的功能,則研究開源庫,了解如何使用其中的代碼、需要加載哪些庫、以及如何加載其中的靜态或者動态庫DLL等。

Step4:進行單元測試,以驗證功能,為合入庫掃除障礙。

Step5:将單元測試過的代碼合入工程代碼子產品中,前提是單元測試無誤。

作者:銘毅天下

轉載請标明出處,原文位址:

http://blog.csdn.net/laoyang360/article/details/19291469

繼續閱讀