天天看點

使用CxImage庫的初體驗

       衆所周知CxImage庫是個功能非常強大的圖檔處理庫,它支大部分常用的圖檔格式,使用它最主要的理由是它能很好的支援帶有Alpha通道的PNG格式圖檔。之前也嘗試過使用微軟的ATL::CImage類,這個類也支援大部分的圖檔格式包括PNG格式的,相比CxImage庫而言它,它隻是一個輕量級的ATL元件類在Windows平台下隻要支援GDI+都可以很友善的使用這個庫。

       失敗的是CImage雖然也支援帶Alpha通道的PNG格式圖檔,但它顯示一個帶Alpha的PNG圖檔透明部分會用白色填充而不能很好的跟背景溶合在一起,這是我主要放棄它的原因。我們在做2D遊戲時候圖像顯示的品質是非常關鍵的,如果擁有一個非常強大的圖像處理庫來做底層支援的話将會事半功倍。

       好了,我來說明一下這個CxImage類的簡單用法,希望給剛接觸CxImage的朋友帶來一些幫助,首先我要說明的是在這裡我以CxImage 6.0.0.0版為例(各個版本可有能所不同)。官方下載下傳位址是:http://www.xdp.it/cximage/

使用CxImage庫的初體驗

每個類都都有一個頭檔案,如果你的代碼中需要CxImage的派生類,那麼就需要加上該派生類相應的頭檔案。如你的代碼中需要處理JPG格式的圖檔,那麼需要CxImageJBG類,是以需要#include "ximajpg.h"

打開工程後可以看到下例這些工程:

- CxImage(生成靜态庫cximage.lib,隻不過改靜态庫調用了png.lib、Jpeg.lib、jbig.lib、Tiff.lib、libdcr.lib、jasper.lib、zlib.lib、mng.lib中的函數,是以用一起使用)

- CxImageCrtDll(生成win32 DLL的動态連結庫,有四個版本,有導入庫cximage.lib和動态連結庫cximagecrt××.dll,在使用時,隻要cximage.lib和cximage.dll就ok了,不需要靜态庫png.lib、Jpeg.lib、jbig.lib、Tiff.lib、libdcr.lib、jasper.lib、zlib.lib、mng.lib。因為這些靜态庫都已經被打包到cximage.dll裡了)

- CxImageMfcDll(生成win32 MFC的DLL的動态連結庫,有四個版本,有導入庫cximage.lib和動态連結庫cximage××.dll,在使用時,隻要cximage.lib和cximage.dll就ok了,不需要靜态庫png.lib、Jpeg.lib、jbig.lib、Tiff.lib、libdcr.lib、jasper.lib、zlib.lib、mng.lib。因為這些靜态庫都已經被打包到cximage.dll裡了)

- dome(生成四種版本的可執行檔案程式dome××.exe,這個exe程式是通過調用靜态庫cximage.lib、png.lib、Jpeg.lib、jbig.lib、Tiff.lib、libdcr.lib、jasper.lib、zlib.lib、mng.lib完成的)

- domeDll(生成四種版本的可執行檔案程式domeDLL××.exe,這個exe程式是通過調用win32 DLL動态連結庫cximagecrt××.dll完成的)

- jasper(生成靜态庫jasper.lib)

- jbig(生成靜态庫jbig.lib)

- jpeg(生成靜态庫Jpeg.lib)

- libdcr(生成靜态庫libdcr.lib)

- mng(生成靜态庫mng.lib)

- png(生成靜态庫png.lib)

- tiff(生成靜态庫Tiff.lib)

- zlib(生成靜态庫zlib.lib,這不是一種檔案格式,而是一種壓縮引擎)

1。首先我們要确定在程式中是希望靜态連結還是動态連結,在這裡我建議大家使用動态連結,因為這個庫有點大,如果使用靜态連結的話你的應用程式體積會額外增加1MB多。

2。然後确定在MFC中使用還是在CRT環境中使用,這個庫專門為你建了這兩個工程來建立不同環境中使用的運作時庫,跟據你的需求來選擇編譯CxImageCrtDll還是CxImageMfcDll工程,如果你希望使用靜态庫連結的話除了這兩個工程不需要編譯其它的工程都需要編譯。并且在引用這個靜态庫的時候要把這些所有編譯過的工程裡的*.lib全部拷到你的程裡去。

3。OK編譯完工程後将以下檔案拷到你建立的工程裡去

先将頭檔案拷到你的工程裡去:

xfile.h、ximacfg.h、ximadef.h、ximage.h、xiofile.h、xmemfile.h

使用靜态連結需要拷以下檔案:

cximage.lib(這個庫會用到其他庫如png.lib,jpeg.lib......的函數,是以要想使用cximage.lib靜态庫,必須加上png.lib、Jpeg.lib、jbig.lib、Tiff.lib、libdcr.lib、jasper.lib、zlib.lib、mng.lib庫,否則在連結cximage.lib中的某個函數時,就找不到。)、png.lib、Jpeg.lib、jbig.lib、Tiff.lib、libdcr.lib、jasper.lib、zlib.lib、mng.lib

如用動态連結需要拷以下檔案:

cximage.lib(這個是DLL中的導入庫,而不是靜态庫cximage.lib)、cximage.dll

4。在你的工程裡引用這個庫#include "ximage.h"、#pragma comment(lib, "cximage.lib")(這是對動态連結庫cximage.dll而言的),如果是靜态連結拷過來的那些*.lib檔案全部要引用進去否則無法連結,在這裡有人可能會問既然隻包含了"ximage.h"這一個頭檔案為什麼要拷那麼多頭檔案過來呢?這是因為"ximage.h"這個頭檔案依賴那幾個頭檔案是以必須拷過來。

5。現在你就可以使用這個CxImage庫了,那我們來加載一幅圖檔然後将它顯示出來吧:

      CxImage  image; // 定義一個CxImage對象

      image.Load("Ooopsy.png", CXIMAGE_FORMAT_PNG); // 加載一幅png圖檔

      // 在OnPaint消息裡顯示出來

      image.Draw(dc.GetSafeHdc(), 0, 0);

     以上隻介紹最簡單的用法,至于基它的功能你就自已嘗試,我就不多說了,要是我一下子說完了CxImage開發者就不需要寫文檔說明了,在它的跟目錄下有一個index.htm這就是它的文檔起始頁,如果你需要的話就自已去看吧!