http://blog.csdn.net/wangjie0377/article/details/7830405算法
CxImage圖像庫
CxImage下載地址:http://www.codeproject.com/KB/graphics/cximage/cximage600_full.zipwindows
做者:Davide Pizzolatoapp
CxImage簡介less
CxImage是一個能夠簡便而快速地打開、保存、顯示和轉換圖像文件的 C++類庫,它能夠用於MFC,能夠打開,保存,顯示,轉換各類常見格式的圖像文件,好比BMP, JPEG, GIF, PNG, TIFF, MNG, ICO, PCX, TGA, WMF, WBMP, JBG, J2K 等格式的文件。能夠實現BMP<->JPG,PNG <->TIFF格式等等的互相轉換。CxImage不只能夠實現圖像文件的類型轉換,還能夠實如今內存圖像數據的類型轉換,而且使用很方便。除了文件格式的相互轉換,它還提供了不少不少圖像後處理的功能,好比圖像模糊,銳化等等,功能很是強大和實用。另外,CxImage是開源的,並在zlib許可下發布,「若是你在你的產品中使用了這些源代碼,雖然致謝不是必須的,可是卻會獲得衆人的欣賞。」簡單地說,你能夠隨意地使用這些代碼,只要你不說它是你本身的就好了。ide
CxImage中的x,大約表明了豐富的圖像格式支持和豐富的圖像處理功能,能夠說CxImage是圖像處理的十全大補湯。函數
用CxImage實現的圖像處理程序工具
開發環境:VC6, C++, Windows, MFC, Visual Studio, VS6, Dev學習
文件格式和連接的庫:CxImage支持以下這些庫的最新版本:
Zlib (1.2.3), Jasper ( 1.900.1), LibMNG (1.0.10), LibPNG (1.2.24). LibTIFF 3.8.2
j2k庫(如今被稱爲openjpeg)和相關的類CxImageJ2K已經從項目中刪除。JPEG2000格式的文件由Jasper和CximageJAS來支持。測試
Cximage 6.00提供了一個新的類CximageRAW和新的庫LibDCR,用於讀取來自數碼相機的RAW圖像。常見的文件擴展名有:RAW, CRW, NEF, CR2, DNG, ORF, ARW, ERF, 3FR, DCR, X3F, MEF, RAF, MRW, PEF, SR2。優化
CximageRAW提供了對圖像的基本解碼功能,它惟一的可選參數能夠由SetCodecOption進行設置,以對插值質量進行可控制。可選的選項有(DECODE_QUALITY_LIN=0, DECODE_QUALITY_VNG=1, DECODE_QUALITY_PPG=2, DECODE_QUALITY_AHD=3).
CximagePNG:如今能夠讀取全部PNG_COLOR_TYPE_類型。可是,每一個通道含有超過8位像素深度的PNG文件,會被轉換到8位,這是CxImage的一個主要限制。
CxImageGIF:如今可以更好地支持對動態GIF圖像的讀取,經過SetRetreiveAllFrames設置屬性,能夠同時對圖像中的全部幀進行解碼。在CxImage的示例項目中,展現瞭如何實現這一選項,並展現瞭如何播放一副GIF動畫。
CxImageBMP: 支持對32位圖像的讀寫(支持Alpha通道)
CxImageICO: 支持對Vista PNG圖標的讀寫;添加對多頁圖標的支持。
CxImageMNG: 支持對MNG Alpha圖層的讀取。
CxImageSKA: 新的用於支持SKA圖像格式的類,這種圖像一般用在視頻租賃軟件中。
CxImageJPG: 爲JPEG圖像格式的二次採樣提供了 新的選項。ENCODE_SUBSAMPLE_422,ENCODE_SUBSAMPLE_444),默認狀況下是 高採樣率的4:1:1 。固然,也能夠被設置成中等的4:2:2或者低等的4:4:4。
下圖展現了不一樣採樣率下,在壓縮圖像中所產生的不一樣數量的僞影。在壓縮有着明顯輪廓的圖像的時候,採用4:4:4的採樣率有助於減小輪廓的僞影。
可移植性
全部的類和項目都經過了不一樣編譯器的測試,包括從VC++6 到VC++2008的微軟系列編譯器,Borland C++ Builder 3和6,同時部分地支持wxDev-C++和MinGW。
全部的庫都支持UNICODE 和非UNICODE兩個版本。(感謝Eric Jesover)
對於第一次使用的用戶,你可使用一個輕量級的版本(cximage600_lite)。這個版本去除了C庫,可是添加了一個簡單的示例項目。
全部控制檯示例(/demo2)和CxImageCrtDll項目能夠在VC++Express2005和 Microsoft Platform SDK環境下編譯經過。若是你在編譯連接的時候,遇到像"unresolved external..."(沒法找到外部符號…)這樣的錯誤,請檢查是否全部C庫都被編譯了。或者手動地添加gdi32.lib 和user32.lib爲項目的依賴庫。
同時,CxImage也能夠在Pocket PC 2003上工做。在CxImage中,爲VC++ 2005編譯器提供了一個能夠工做的版本和相應的實例(cximage600_ce)。對於舊式的嵌入式VC編譯器,最主要的限制是沒法支持對異常的處理。爲了解決這個問題,相應的異常處理語句try,throw和catch已經被定義在ximadef.h中的三個宏取代,同時還定義了CXIMAGE_SUPPORT_EXCEPTION_HANDLING。經過這樣的方法,取消對異常處理的支持,能夠成功編譯連接整個庫。雖然這個解決辦法不是那麼優雅,可是當異常處理被取消的時候,對代碼的影響是最小的。同時,當異常處理被啓用的時候,一樣不會形成源代碼的修改與變更。
對於平臺之間little-endian和big-endian的兼容性,對於內建支持的圖像文件格式(bmp, ico, tga, pcx, gif, ska),由ntohs和ntohl控制。
示例
大多數新的特性能夠在CxImage的主要示例程序中嘗試和體驗。這個示例程序只是一個測試平臺,雖然它提供不少有用的特性,可是它實在不是一個嚴謹的應用程序。
·CQuantizer : 這個類被DecreaseBpp菜單項所使用。在之前的版本中,這裏有一個取整的錯誤,在某些狀況下,白色(255,255,255)會被轉換成(254,254,254)。在新的版本中,這個問題已經被修復了。
·Copy/Paste : 如今,新的粘貼功能支持元文件圖像(例如,從Office應用程序中複製而來的圖像)。這個示例內部使用了自定義的剪切板格式以測試Dump/Undump方法。Copy只工做在當前選區,可是你能夠經過CxImage/Remove Selection 複製整幅圖像。
·FloodFill : (/View/Tools/Flood Fill) 經過一個浮動的對話框,你能夠測試色彩填充的顏色,誤差,透明度和是否選擇。當透明度爲0而且選擇區域功能啓用的時候,這個功能就變現爲"魔法棒",用於根據顏色選區某個區域。
·Graph data extraction : (/Filters/graph data extraction) 這個示例演示瞭如何從圖像(從掃描儀獲取或者從互聯網下載所得)中提取數字信息。轉換後的數據被粘貼到剪切板,同時能夠被保存成文本文件或者Excel表格文件。
數據提取對話框
數據提取結果
·RedEyeRemove : (/Filters/Non Linear/Remove Red Eye) 去除紅眼的功能在照片處理中常常用到。你 必須在紅眼周圍選擇一個區域,而後去除紅眼的功能就會對紅色通道進行過濾,從而去掉照片中的紅眼。紅眼的選區是一個矩形區域,同時能夠包括部分的虹膜(眼黑),過濾器會在以選區中點爲中心的圓心區域工做,不會影響到選中的眼黑部分。
·SelectiveBlur / UnsharpMask : 這些非線性的濾鏡能夠增長圖像的質量。SelectiveBlur能夠去除二次噪聲(好比JPEG圖像中的僞影或者是數碼相機的噪聲),從而展現圖像中的更多細節。而UnsharpMask能夠加強圖像的細節,可是卻不會添加噪聲。
·Custom linear filters : (/Filters/Linear/Custom) 一個用於測試新的濾鏡功能核心的圖像用戶界面。
·Histogram : (/Colors/Histogram/...) 爲了測試HistogramStretch(直方圖),這個示例中提供了不少菜單項,經過不一樣的方法(0 = luminance, 1 = linked channels , 2 = independent channels)來測試直方圖功能。對於有噪聲的圖像,閾值(threshold)這個參數加強了算法的健壯性。半飽和度(Half Saturation)和全飽和度(Full Saturation)能夠測試轉換顏色空間(ConvertColorSpace),直方圖(Histogram)和飽和度(Saturate)在YUV顏色空間對直方圖的拉伸效果。
·Thresholding : ( /Colors/Threshold... and /Colors/Adaptive Threshold). 透明度閾值(OptimalThreshold)是一個新的用於查找二進制圖像透明度閾值的新方法。可選的算法有:
1 = 最大類間方差 (Otsu);
2 = 基特勒和伊爾林格沃斯(Kittler & Illingworth);
3 = 最大熵(maximum entropy);
4 = 位差(potential difference);
0 = 平均全部方法 (默認狀況下,這也是示例程序中所使用的方法);
"保留低於閾值的顏色"(preserve colors less than the threshold)的選項,將測試Threshold2方法。這對於過濾帶有噪聲背景的彩色圖像頗有用。通過處理,咱們將獲得一幅帶有一致背景的彩色圖像(噪聲被去除)。AdaptiveThreshold是對方法OptimalThreshold的一個應用,它將建立不少閾值模板。AdaptiveThreshold對於有着不一致的燈光照射效果的圖像,很是有用。對於這類圖像,咱們不能簡單地在整幅圖像中使用某個單一的閾值。可是,若是咱們的參數設置得不對,咱們將獲得一個很是差勁的處理結果。
·Add shadow : (/Filters/Add Shadow...) 這個菜單項的功能演示瞭如何將CxImage的多個小功能(選擇(selections),高斯模糊( GaussianBlur),混合( Mix))組合使用,以達到常見的圖像處理效果。
·Text smoothing : DrawStringEx 實現了一個新的選項CXTEXTINFO::smooth。咱們能夠經過文本工具(位於/View/Tools/Text),選中抗鋸齒("antialias")選項對這個功能進行測試。
相似的效果也一樣能夠利用TextBlur (/Filters/Non Linear/Text Blur)進行後處理得到。這是一個非線性的過濾器,它只對角或圓形的邊緣起做用,從而不會影響到縱向或橫向的線。下圖展現了不一樣平滑方法的實際效果:
CxImage庫的結構
在整個庫的繼承樹中,CxImage位於全部其餘模塊的頂部。這不是一個徹底的符合OOP的方式,可是至少從最初的版本一直到如今,它都工做得很好。如今想要改變整個結構,已經太晚了。可是,你老是可使用這些繼承類來操做相應格式的圖像,例如你可使用CxImageTIF來保存多頁的TIFF文件。這樣顯得很是直觀。
鏈接全部模塊和C庫的是CxFile。這是一個虛類,它提供了標準的方法,用於訪問硬盤或者內存的文件數據。
CxImage的繼承樹
一個CxImage對象基本上對應於一幅位圖,同時添加了一些額外的成員變量用於存儲一些有用的信息。
- class CxImage
- {
- ...
- protected:
- void* pDib;
- BITMAPINFOHEADER head;
- CXIMAGEINFO info;
- BYTE* pSelection;
- BYTE* pAlpha;
- CxImage** ppLayers;
- CxImage** ppFrames;
- }
- class CxImage
- {
- ...
- protected:
- void* pDib;
- BITMAPINFOHEADER head;
- CXIMAGEINFO info;
- BYTE* pSelection;
- BYTE* pAlpha;
- CxImage** ppLayers;
- CxImage** ppFrames;
- }
CxImage::head 是位圖文件的文件頭,而CxImage::pDib就是一個普通的位圖(就像你在CxImageBMP::Encode中看到的同樣)。
CxImage::info 是一個方便的信息容器。這些信息被不一樣的文件格式所共享,同時供全部成員函數訪問。
- typedef struct tagCxImageInfo {
- DWORD dwEffWidth;
- BYTE* pImage;
- void* pGhost;
- DWORD dwType;
- char szLastError[256];
- long nProgress;
- long nEscape;
- long nBkgndIndex;
- RGBQUAD nBkgndColor;
- BYTE nQuality;
- long nFrame;
- long nNumFrames;
- DWORD dwFrameDelay;
- long xDPI;
- long yDPI;
- RECT rSelectionBox;
- BYTE nAlphaMax;
- bool bAlphaPaletteEnabled;
- bool bEnabled;
- long xOffset;
- long yOffset;
- DWORD dwEncodeOption;
- RGBQUAD last_c;
- BYTE last_c_index;
- bool last_c_isvalid;
- long nNumLayers;
- DWORD dwFlags;
- } CXIMAGEINFO;
- typedef struct tagCxImageInfo {
- DWORD dwEffWidth;
- BYTE* pImage;
- void* pGhost;
- DWORD dwType;
- char szLastError[256];
- long nProgress;
- long nEscape;
- long nBkgndIndex;
- RGBQUAD nBkgndColor;
- BYTE nQuality;
- long nFrame;
- long nNumFrames;
- DWORD dwFrameDelay;
- long xDPI;
- long yDPI;
- RECT rSelectionBox;
- BYTE nAlphaMax;
- bool bAlphaPaletteEnabled;
- bool bEnabled;
- long xOffset;
- long yOffset;
- DWORD dwEncodeOption;
- RGBQUAD last_c;
- BYTE last_c_index;
- bool last_c_isvalid;
- long nNumLayers;
- DWORD dwFlags;
- } CXIMAGEINFO;
CxImage對象一樣是圖層的集合,每一個圖層的緩衝區只在須要的時候申請。
CxImage::pDib是背景圖像。 CxImage::pAlpha是透明層。CxImage::pSelection是選區層,用於建立要對圖像的感興趣區域進行處理的選擇區域。在這三個特殊層之上,你能夠添加通用的其餘層,這些層都保存在CxImage::ppLayers中。通用層也是完整的CxImage對象,因此你能夠建立複雜的嵌套層。CxImage::ppFrames 爲動態圖像(GIF)所預留。
CxImage類成員和操做
CxImage使用Doxygen 產生文檔,可是因爲一些歷史的緣由,不少不太通用的功能尚未文檔。類成員的參考資料,發佈歷史以及許可信息均可以在這裏(here )找到。
支持的格式和選項
整個CxImage庫很是大,在主要的頭文件ximcfg.h中,你能夠找到不少編譯選項開關,用於啓用或者禁用某些特定的圖像格式或者功能。每一個JPG, PNG和 TIFF庫將使得應用程序增長大約100KB的大小,同時,CxImage將使得應用程序增長大約50KB的大小。因此,爲了減少你的應用程序的體積,你應該支持和連接你的應用程序確實須要的格式。
格式 |
定義#define |
須要的庫 |
尺寸 [KB] |
BMP GIF ICO TGA PCX WBMP WMF SKA |
CXIMAGE_SUPPORT_BMP CXIMAGE_SUPPORT_GIF CXIMAGE_SUPPORT_ICO CXIMAGE_SUPPORT_TGA CXIMAGE_SUPPORT_PCX CXIMAGE_SUPPORT_WBMP CXIMAGE_SUPPORT_WMF CXIMAGE_SUPPORT_SKA |
內建 |
24 |
JPEG |
CXIMAGE_SUPPORT_JPG |
jpeg |
88 |
PNG |
CXIMAGE_SUPPORT_PNG |
png, zlib |
104 |
MNG |
CXIMAGE_SUPPORT_MNG |
mng, zlib, jpeg |
148 |
TIFF |
CXIMAGE_SUPPORT_TIF |
tiff, zlib, jpeg |
124 |
JBIG |
CXIMAGE_SUPPORT_JBG |
jbig |
28 |
PNM,PPM,PGM RAS |
CXIMAGE_SUPPORT_PNM CXIMAGE_SUPPORT_RAS |
jasper |
176 |
JPEG-2000 |
CXIMAGE_SUPPORT_JP2 CXIMAGE_SUPPORT_JPC CXIMAGE_SUPPORT_PGX |
jasper |
176 |
RAW |
CXIMAGE_SUPPORT_RAW |
libdcr |
132 |
選項 |
定義#define |
尺寸[KB] |
CxImage核心 |
全部開關關閉 |
20 |
幾何變換 (geometric transformations) |
CXIMAGE_SUPPORT_TRANSFORMATION |
16 |
圖像處理
(image processing)
|
CXIMAGE_SUPPORT_DSP |
24 |
繪製和特殊的窗口函數
(drawing and windows specific functions)
|
CXIMAGE_SUPPORT_WINDOWS |
12 |
透明
(transparency)
|
CXIMAGE_SUPPORT_ALPHA |
4 |
選擇
(selections)
|
CXIMAGE_SUPPORT_SELECTION |
4 |
多層支持
(multiple layers)
|
CXIMAGE_SUPPORT_LAYERS |
< 4 |
圖像格式轉換
(graphic formats conversion)
|
CXIMAGE_SUPPORT_DECODE CXIMAGE_SUPPORT_ENCODE |
< 4 |
插值函數
(interpolation functions)
|
CXIMAGE_SUPPORT_INTERPOLATION |
< 4 |
異常處理
(exception handling)
|
CXIMAGE_SUPPORT_EXCEPTION_HANDLING |
< 4 |
在你的項目中使用CxImage
以下圖所示,CxImgLib.dsw工做空間展現了構建一個包含絕大多數功能和支持大多數圖像格式的應用程序(demo.exe)所須要的全部庫。你必須先編譯全部的庫,而後才能夠連接你最終的應用程序。
CxImgLib.dsw工做空間
在相同的工做空間中,你能夠找到用於構建不一樣庫和應用程序的項目:
·CxImage : cximage.lib - 靜態庫
·CxImageCrtDll : cximagecrt.dll - DLL,不使用MFC
·CxImageMfcDll : cximage.dll - DLL,使用MFC
·Demo : 示例程序demo.exe,跟cximage.lib和C庫連接。
·DemoDll : demodll.exe - 跟cximagecrt.dll連接
·libdcr,jasper,jbig,jpeg,png,tiff,zlib : 靜態的C庫
構建這些項目須要幾分鐘時間,當全部項目構建完成後,你能夠選擇demo項目並執行應用程序。
要想在你本身的項目中使用CxImage,你必須編輯下面這些項目設置設置(針對Visual C++ 6.0):
Project Settings(項目設置)
- Project Settings
- |- C/C++
- | |- Code Generation
- | | |- Use run-time library : Multithreaded DLL (must be the same for
- | | | all the linked libraries)
- | | |- Struct member alignment : must be the same for all the linked
- | | | libraries
- | |- Precompiled headers : not using precompiled headers
- | |- Preprocessor
- | |- Additional Include Directories: ../cximage
- |- Link
- |- General
- |- Object/library modules: ../png/Debug/png.lib
- ../raw/Debug/libdcr.lib
- ../jpeg/Debug/jpeg.lib
- ../zlib/Debug/zlib.lib
- ../tiff/Debug/tiff.lib
- ../jasper/Debug/jasper.lib
- ../cximage/Debug/cximage.lib ...
- Project Settings
- |- C/C++
- | |- Code Generation
- | | |- Use run-time library : Multithreaded DLL (must be the same for
- | | | all the linked libraries)
- | | |- Struct member alignment : must be the same for all the linked
- | | | libraries
- | |- Precompiled headers : not using precompiled headers
- | |- Preprocessor
- | |- Additional Include Directories: ../cximage
- |- Link
- |- General
- |- Object/library modules: ../png/Debug/png.lib
- ../raw/Debug/libdcr.lib
- ../jpeg/Debug/jpeg.lib
- ../zlib/Debug/zlib.lib
- ../tiff/Debug/tiff.lib
- ../jasper/Debug/jasper.lib
- ../cximage/Debug/cximage.lib ...
在你的源代碼中,你必須引入CxImage的頭文件ximage.h。在你的代碼中添加以下語句:#include "ximage.h"。
注意,不要混合debug和release模塊,每一個配置必須使用各自相應的庫文件。
在CxImage中添加自定義的函數
爲CxImage添加一個新的圖像處理函數並不困難。在這裏,我將以CxImage::Jitter爲例子,描述如何爲CxImage添加自定義的函數。雖然這個函數很簡單, 可是它卻展現了使用CxImage時所須要注意的方方面面。
首先,咱們須要聲明這個函數:
- bool Jitter(long radius=2)
- bool Jitter(long radius=2)
在ximage.h頭文件的CXIMAGE_SUPPORT_DSP部分,你能夠在public區域的任何部分聲明這個函數。
如今,咱們開始定義這個函數:
- bool CxImage::Jitter(long radius)
- {
-
- if (!pDib) return false;
-
-
- long nx,ny;
-
-
- CxImage tmp(*this,pSelection!=0,true,true);
-
-
-
- long xmin,xmax,ymin,ymax;
- if (pSelection){
- xmin = info.rSelectionBox.left; xmax = info.rSelectionBox.right;
- ymin = info.rSelectionBox.bottom; ymax = info.rSelectionBox.top;
- } else {
- xmin = ymin = 0;
- xmax = head.biWidth; ymax=head.biHeight;
- }
-
-
- for(long y=ymin; y <ymax; y++){
-
-
- info.nProgress = (long)(100*y/head.biHeight);
-
-
- if (info.nEscape) break;
-
-
- for(long x=xmin; x<xmax; x++){
-
-
- #if CXIMAGE_SUPPORT_SELECTION
- if (SelectionIsInside(x,y))
- #endif //CXIMAGE_SUPPORT_SELECTION
- {
-
- nx=x+(long)((rand()/(float)RAND_MAX - 0.5)*(radius*2));
- ny=y+(long)((rand()/(float)RAND_MAX - 0.5)*(radius*2));
- if (!IsInside(nx,ny)) {
- nx=x;
- ny=y;
- }
-
-
-
-
- if (head.biClrUsed==0){
- tmp.SetPixelColor(x,y,GetPixelColor(nx,ny));
- } else {
- tmp.SetPixelIndex(x,y,GetPixelIndex(nx,ny));
- }
-
-
- #if CXIMAGE_SUPPORT_ALPHA
- tmp.AlphaSet(x,y,AlphaGet(nx,ny));
- #endif //CXIMAGE_SUPPORT_ALPHA
-
- }
- }
- }
-
-
- Transfer(tmp);
- return true;
- }
- bool CxImage::Jitter(long radius)
- {
-
- if (!pDib) return false;
-
-
- long nx,ny;
-
-
- CxImage tmp(*this,pSelection!=0,true,true);
-
-
-
- long xmin,xmax,ymin,ymax;
- if (pSelection){
- xmin = info.rSelectionBox.left; xmax = info.rSelectionBox.right;
- ymin = info.rSelectionBox.bottom; ymax = info.rSelectionBox.top;
- } else {
- xmin = ymin = 0;
- xmax = head.biWidth; ymax=head.biHeight;
- }
-
-
- for(long y=ymin; y <ymax; y++){
-
-
- info.nProgress = (long)(100*y/head.biHeight);
-
-
- if (info.nEscape) break;
-
-
- for(long x=xmin; x<xmax; x++){
-
-
- #if CXIMAGE_SUPPORT_SELECTION
- if (SelectionIsInside(x,y))
- #endif //CXIMAGE_SUPPORT_SELECTION
- {
-
- nx=x+(long)((rand()/(float)RAND_MAX - 0.5)*(radius*2));
- ny=y+(long)((rand()/(float)RAND_MAX - 0.5)*(radius*2));
- if (!IsInside(nx,ny)) {
- nx=x;
- ny=y;
- }
-
-
-
-
- if (head.biClrUsed==0){
- tmp.SetPixelColor(x,y,GetPixelColor(nx,ny));
- } else {
- tmp.SetPixelIndex(x,y,GetPixelIndex(nx,ny));
- }
-
-
- #if CXIMAGE_SUPPORT_ALPHA
- tmp.AlphaSet(x,y,AlphaGet(nx,ny));
- #endif //CXIMAGE_SUPPORT_ALPHA
-
- }
- }
- }
-
-
- Transfer(tmp);
- return true;
- }
示例:
如何轉換一種格式到另一種格式
- CxImage image;
- 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);
- }
- image.Load("image.png", CXIMAGE_FORMAT_PNG);
- if (image.IsValid()){
- image.Save("image.tif",CXIMAGE_FORMAT_TIF);
- }
- CxImage image;
- 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);
- }
- image.Load("image.png", CXIMAGE_FORMAT_PNG);
- if (image.IsValid()){
- image.Save("image.tif",CXIMAGE_FORMAT_TIF);
- }
如何從資源中加載圖像
- CxImage* newImage = new CxImage();
- newImage->LoadResource(FindResource(NULL,MAKEINTRESOURCE(IDR_PNG1),
- "PNG"),CXIMAGE_FORMAT_PNG);
-
- CxImage* newImage = new CxImage();
- HINSTANCE hdll=LoadLibrary("imagelib.dll");
- if (hdll){
- HRSRC hres=FindResource(hdll,MAKEINTRESOURCE(IDR_JPG1),"JPG");
- newImage->LoadResource(hres,CXIMAGE_FORMAT_JPG,hdll);
- FreeLibrary(hdll);
- }
-
- HBITMAP bitmap = ::LoadBitmap(AfxGetInstanceHandle(),
- MAKEINTRESOURCE(IDB_BITMAP1)));
- CxImage *newImage = new CxImage();
- newImage->CreateFromHBITMAP(bitmap);
- CxImage* newImage = new CxImage();
- newImage->LoadResource(FindResource(NULL,MAKEINTRESOURCE(IDR_PNG1),
- "PNG"),CXIMAGE_FORMAT_PNG);
-
- CxImage* newImage = new CxImage();
- HINSTANCE hdll=LoadLibrary("imagelib.dll");
- if (hdll){
- HRSRC hres=FindResource(hdll,MAKEINTRESOURCE(IDR_JPG1),"JPG");
- newImage->LoadResource(hres,CXIMAGE_FORMAT_JPG,hdll);
- FreeLibrary(hdll);
- }
-
- HBITMAP bitmap = ::LoadBitmap(AfxGetInstanceHandle(),
- MAKEINTRESOURCE(IDB_BITMAP1)));
- CxImage *newImage = new CxImage();
- newImage->CreateFromHBITMAP(bitmap);
如何解碼內存中的圖像
- CxImage image((BYTE*)buffer,size,image_type);
-
- CxMemFile memfile((BYTE*)buffer,size);
- CxImage image(&memfile,image_type);
-
- CxMemFile memfile((BYTE*)buffer,size);
- CxImage* image = new CxImage();
- image->Decode(&memfile,type);
- CxImage image((BYTE*)buffer,size,image_type);
-
- CxMemFile memfile((BYTE*)buffer,size);
- CxImage image(&memfile,image_type);
-
- CxMemFile memfile((BYTE*)buffer,size);
- CxImage* image = new CxImage();
- image->Decode(&memfile,type);
如何對內存中的圖像編碼
- long size=0;
- BYTE* buffer=0;
- image.Encode(buffer,size,image_type);
- ...
- image.FreeMemory(buffer);
-
- CxMemFile memfile;
- memfile.Open();
- image.Encode(&memfile,image_type);
- BYTE* buffer = memfile.GetBuffer();
- long size = memfile.Size();
- ...
- image.FreeMemory(buffer);
- long size=0;
- BYTE* buffer=0;
- image.Encode(buffer,size,image_type);
- ...
- image.FreeMemory(buffer);
-
- CxMemFile memfile;
- memfile.Open();
- image.Encode(&memfile,image_type);
- BYTE* buffer = memfile.GetBuffer();
- long size = memfile.Size();
- ...
- image.FreeMemory(buffer);
如何建立一副多頁的TIFF
- CxImage *pimage[3];
- pimage[0]=&image1;
- pimage[1]=&image2;
- pimage[2]=&image3;
- FILE* hFile;
- hFile = fopen("multipage.tif","w+b");
- CxImageTIF multiimage;
- multiimage.Encode(hFile,pimage,3);
- fclose(hFile);
-
- FILE* hFile;
- hFile = fopen("c://multi.tif","w+b");
- CxImageTIF image;
- image.Load("c://1.tif",CXIMAGE_FORMAT_TIF);
- image.Encode(hFile,true);
- image.Load("c://2.bmp",CXIMAGE_FORMAT_BMP);
- image.Encode(hFile,true);
- image.Load("c://3.png",CXIMAGE_FORMAT_PNG);
- image.Encode(hFile);
- fclose(hFile);
- CxImage *pimage[3];
- pimage[0]=&image1;
- pimage[1]=&image2;
- pimage[2]=&image3;
- FILE* hFile;
- hFile = fopen("multipage.tif","w+b");
- CxImageTIF multiimage;
- multiimage.Encode(hFile,pimage,3);
- fclose(hFile);
-
- FILE* hFile;
- hFile = fopen("c://multi.tif","w+b");
- CxImageTIF image;
- image.Load("c://1.tif",CXIMAGE_FORMAT_TIF);
- image.Encode(hFile,true);
- image.Load("c://2.bmp",CXIMAGE_FORMAT_BMP);
- image.Encode(hFile,true);
- image.Load("c://3.png",CXIMAGE_FORMAT_PNG);
- image.Encode(hFile);
- fclose(hFile);
如何複製和粘貼圖像
- HANDLE hDIB = image->CopyToHandle();
- if (::OpenClipboard(AfxGetApp()->m_pMainWnd->GetSafeHwnd())) {
- if(::EmptyClipboard()) {
- if (::SetClipboardData(CF_DIB,hDIB) == NULL ) {
- AfxMessageBox( "Unable to set Clipboard data" );
- } } }
- CloseClipboard();
-
- HANDLE hBitmap=NULL;
- CxImage *newima = new CxImage();
- if (OpenClipboard()) hBitmap=GetClipboardData(CF_DIB);
- if (hBitmap) newima->CreateFromHANDLE(hBitmap);
- CloseClipboard();
- HANDLE hDIB = image->CopyToHandle();
- if (::OpenClipboard(AfxGetApp()->m_pMainWnd->GetSafeHwnd())) {
- if(::EmptyClipboard()) {
- if (::SetClipboardData(CF_DIB,hDIB) == NULL ) {
- AfxMessageBox( "Unable to set Clipboard data" );
- } } }
- CloseClipboard();
-
- HANDLE hBitmap=NULL;
- CxImage *newima = new CxImage();
- if (OpenClipboard()) hBitmap=GetClipboardData(CF_DIB);
- if (hBitmap) newima->CreateFromHANDLE(hBitmap);
- CloseClipboard();
如何在圖片框控件(Picture Box)中顯示圖像
- HBITMAP m_bitmap = NULL;
- CxImage image("myfile.png", CXIMAGE_FORMAT_PNG);
- ...
- CDC* hdc = m_picture.GetDC();
- HBITMAP m_bitmap = image.MakeBitmap(hdc->m_hDC);
- HBITMAP hOldBmp = m_picture.SetBitmap(m_bitmap);
- if (hOldBmp) DeleteObject(hOldBmp);
- if (hdc->m_hDC) m_picture.ReleaseDC(hdc);
- ...
- if (m_bitmap) DeleteObject(m_bitmap);
- HBITMAP m_bitmap = NULL;
- CxImage image("myfile.png", CXIMAGE_FORMAT_PNG);
- ...
- CDC* hdc = m_picture.GetDC();
- HBITMAP m_bitmap = image.MakeBitmap(hdc->m_hDC);
- HBITMAP hOldBmp = m_picture.SetBitmap(m_bitmap);
- if (hOldBmp) DeleteObject(hOldBmp);
- if (hdc->m_hDC) m_picture.ReleaseDC(hdc);
- ...
- if (m_bitmap) DeleteObject(m_bitmap);
譯後序:
關於圖像處理庫,我相信你們有一個共同的疑問:這麼多圖像處理庫,我該如何選擇?在CSDN的blog中有這樣一段文字,比較透徹地回答了這個問題,感謝做者的透徹解釋:
"CxImage類庫是一 個優秀的圖像操做類庫。它能夠快捷地存取、顯示、轉換各類圖像。有的讀者可能說,有那麼多優秀的圖形庫,如OpenIL,FreeImage, PaintLib等等,它們可謂是功能強大,齊全,不必用其它的類庫。但我要說,這些類庫基本上沒有免費的,使用這些類庫,你要被這樣那樣的許可協議所 束縛。
在這點上,CxImage類庫是徹底免費的。另外,在使用上述類庫時,你會遇到重重麻煩。由於它們大部分是平臺無關的,且用C語言寫成,有的還夾雜 着基本的C++ wrapper和成堆德編譯選項的聲明須要你去處理。而CxImage類庫在這方面作得很好。還有讓我最看好的,就是做者徹底公開了源代碼。相對於那些封 裝好的圖形庫和GDI+來講,這一點使咱們能夠進一步學習各類編解碼技術,而再也不浮於各類技術的表面。"