日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

CxImage类库的简介

發(fā)布時間:2023/11/27 生活经验 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CxImage类库的简介 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)自:http://www.sudu.cn/info/html/edu/20080403/259688.html

?

CxImage類庫是個優(yōu)秀的圖像操作類庫。他能快捷地存取、顯示、轉(zhuǎn)換各種圖像。有的讀者可能說,有那么多優(yōu)秀的圖像庫,如OpenIL,FreeImage,PaintLib等等,他們可謂是功能強大,齊全,沒必要用其他的類庫。但我要說,這些類庫基本上沒有免費的,使用這些類庫,你要被這樣那樣的許可協(xié)議所束縛。在這點上,CxImage類庫是完全免費的。另外,在使用上述類庫時,你會遇見重重麻煩。因為他們大部分是平臺無關的,且用C語言寫成,有的還夾雜著基本的C++ wrapper和成堆德編譯選項的聲明需要你去處理。而CxImage類庫在這方面做得非常好。更有讓我最看好的,就是作者完全公開了原始碼。相對于那些封裝好的圖像庫和GDI+來說,這一點使我們能進一步學習各種編解碼技術,而不再浮于各種技術的表面。

CxImage類庫的結(jié)構:

?

一個CxImage對象是個擴展了的位圖。作者只是在位圖結(jié)構上添加了一些起存儲信息作用的成員變量。一個CxImage對象(同時)也是一組層。每個層只有在需要時才會分配相應的緩沖區(qū)。CxImage::pDib代表著背景圖像,CxImage::pAlpha代表著透明層,CxImage::pSelection代表著被選中的層,被用來創(chuàng)建圖像處理時讓用戶感興趣的區(qū)域。在這三個特別層面的基礎上,你能增加一些額外的層,這些層能存儲在CxImage::pLayers中。一般說來,層是個完整的CxImage對象。因此,你能構造非常復雜的嵌套層。下面是CxImage的一些成員變量:

class CxImage
{
...
protected:
void* pDib;            //包含文件頭,調(diào)色板等等
BITMAPINFOHEADER head; //標準的文件頭(位圖)
CXIMAGEINFO info;      //擴展了的信息
BYTE* pSelection;      //用戶選中的區(qū)域
BYTE* pAlpha;          //alpha通道
CxImage** pLayers;     //通用層
}
typedef struct tagCxImageInfo {
DWORD   dwEffWidth;       //DWORD 掃描線寬
BYTE*   pImage;           //圖像位數(shù)
void*   pGhost;           //if this is a ghost, pGhost point to the body
DWORD   dwType;           //原圖像的格式
char    szLastError[256]; //出錯信息
long    nProgress;        //監(jiān)視循環(huán)的次數(shù)
long    nEscape;          //跳出標志
long    nBkgndIndex;      //GIF, PNG, MNG格式使用
RGBQUAD nBkgndColor;      //RGB三原色透明度
BYTE    nQuality;         //JPEG格式使用
long    nFrame;           //TIF, GIF, MNG使用 :實際的幀數(shù)
long    nNumFrames;       //TIF, GIF, MNG使用 :幀總數(shù)
DWORD   dwFrameDelay;     //GIF, MNG使用
long    xDPI;             //水平分辨率
long    yDPI;             //垂直分辨率
RECT    rSelectionBox;    //選中的矩形區(qū)
BYTE    nAlphaMax;        //陰影的最大不透明度
bool    bAlphaPaletteEnabled;  //如果調(diào)色板中有Alpha通道則為真
bool    bEnabled;         //打開繪圖函數(shù)
long    xOffset;
long    yOffset;
DWORD   dwEncodeOption;   //一些編碼選項
RGBQUAD last_c;           //一些優(yōu)化選項
BYTE    last_c_index;
bool    last_c_isvalid;
long    nNumLayers;
DWORD   dwFlags;
} CXIMAGEINFO;
要在picture box中顯示一個png格式的文件,只需:
CxImage image("myfile.png", CXIMAGE_FORMAT_PNG);
HBITMAP m_bitmap = image.MakeBitmap(m_picture.GetDC()->m_hDC);
m_picture.SetBitmap(m_bitmap);
其他格式則類推。
Examples: how to ...
... convert from a format to another
CxImage  image;
// bmp -> jpg
image.Load("image.bmp", CXIMAGE_FORMAT_BMP);
if (image.IsValid()){
if(!image.IsGrayScale()) image.IncreaseBpp(24);
image.SetJpegQuality(99);
image.Save("image.jpg",CXIMAGE_FORMAT_JPG);
}
// png -> tif
image.Load("image.png", CXIMAGE_FORMAT_PNG);
if (image.IsValid()){
image.Save("image.tif",CXIMAGE_FORMAT_TIF);
}
... load an image resource
//Load the resource IDR_PNG1 from the PNG resource type
CxImage* newImage = new CxImage();
newImage->LoadResource(FindResource(NULL,MAKEINTRESOURCE(IDR_PNG1),
"PNG"),CXIMAGE_FORMAT_PNG);
or//Load the resource IDR_JPG1 from DLL
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);
}
or//Load a bitmap resource;
HBITMAP bitmap = ::LoadBitmap(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP1)));
CxImage *newImage = new CxImage();
newImage->CreateFromHBITMAP(bitmap);
... decode an image from memory
CxImage image((BYTE*)buffer,size,image_type);
orCxMemFile memfile((BYTE*)buffer,size);
CxImage image(&memfile,image_type);
orCxMemFile memfile((BYTE*)buffer,size);
CxImage* image = new CxImage();
image->Decode(&memfile,type);
... encode an image in memory
long size=0;
BYTE* buffer=0;
image.Encode(buffer,size,image_type);
...
free(buffer);
orCxMemFile memfile;
memfile.Open();
image.Encode(&memfile,image_type);
BYTE* buffer = memfile.GetBuffer();
long size = memfile.Size();
...
free(buffer);
... create a multipage 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);
orFILE* 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);
... copy/paste an image
//copy
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();
//paste
HANDLE hBitmap=NULL;
CxImage *newima = new CxImage();
if (OpenClipboard()) hBitmap=GetClipboardData(CF_DIB);
if (hBitmap) newima->CreateFromHANDLE(hBitmap);
CloseClipboard();

需要大家注意的是:整個CxImage類庫非常大。如果你只需要能處理其中的幾種格式,你能在主要的頭文件ximage.h中找到一些開關選項來關閉一些圖像庫。JPG、PNG、TIFF中的每一個庫,都會向最終程式增加約100KB的內(nèi)容。而CxImage類庫壓縮后只有約60KB。所以,你需要謹慎挑選一些你真正需要的類庫。作者提供的示例工程在編譯后,你會發(fā)現(xiàn)如下一些文件: ·CxImage : cximage.lib - static library ·CxImageCrtDll : cximagecrt.dll - DLL not using mfc ·CxImageMfcDll : cximage.dll - DLL using mfc ·Demo : demo.exe - program linked with cximage.lib and the C libraries ·DemoDll : demodll.exe - program linked with cximagecrt.dll ·j2k,jasper,jbig,jpeg,png,tiff,zlib : static C libraries 構建這些工程需要耗費幾分鐘的時間(中間文件可達60MB)。下面則是使用CxImage類庫前必須設置的一些參數(shù):

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
../jpeg/Debug/jpeg.lib
../zlib/Debug/zlib.lib
../tiff/Debug/tiff.lib
../cximage/Debug/cximage.lib  ...

兼容性: - Microsoft Visual C++ 6.0 (static library, DLL and OCX builds) - Microsoft Visual C++ .NET 2003 - Borland C++ Builder version 3 and version 6 - Kdevelop 2.1 with gcc 2.96 (Linux)

關于CxImage類庫作者: Davide Pizzolato,一位電子工程師。1984年開始編程,已不在乎使用何種編程語言來研發(fā)軟件?,F(xiàn)就職于Askoll的電子研發(fā)部。

///

http://www.cppblog.com/acoder/archive/2009/10/27/99568.aspx

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

?

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

- CxImage

- CxImageCrtDll

- CxImageMfcDll

- dome

- domeDll

- jasper

- jbig

- jpeg

- libdcr

- mng

- png

- tiff

- zlib

?

1。首先我們要確定在程序中是希望靜態(tài)鏈接還是動態(tài)鏈接,在這里我建議大家使用動態(tài)鏈接,因為這個庫有點大,如果使用靜態(tài)鏈接的話你的應用程序體積會額外增加1MB多。

?

2。然后確定在MFC中使用還是在CRT環(huán)境中使用,這個庫專門為你建了這兩個工程來創(chuàng)建不同環(huán)境中使用的運行時庫,跟據(jù)你的需求來選擇編譯CxImageCrtDll還是CxImageMfcDll工程,如果你希望使用靜態(tài)庫鏈接的話除了這兩個工程不需要編譯其它的工程都需要編譯。并且在引用這個靜態(tài)庫的時候要把這些所有編譯過的工程里的*.lib全部拷到你的程里去。還有要注意編譯的選項要和自己的工程設置一樣,比如,是release 方式還是debug,是Unicode?還是非Unicode?。

3。OK編譯完工程后將以下文件拷到你建立的工程里去

先將頭文件拷到你的工程里去:

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

?

使用靜態(tài)鏈接需要拷以下文件:

cximage.lib、png.lib、Jpeg.lib、jbig.lib、Tiff.lib、libdcr.lib、jasper.lib、zlib.lib、mng.lib

?

如用動態(tài)鏈接需要拷以下文件:

cximage.lib、cximage.dll

?

4。在你的工程里引用這個庫#include "ximage.h"、#pragma comment(lib, "cximage.lib")如果是靜態(tài)鏈接拷過來的那些*.lib文件全部要引用進去否則無法鏈接,在這里有人可能會問既然只包含了"ximage.h"這一個頭文件為什么要拷那么多頭文件過來呢?這是因為"ximage.h"這個頭文件依賴那幾個頭文件所以必須拷過來。

?

5?,F(xiàn)在你就可以使用這個CxImage庫了,那我們來加載一幅圖片然后將它顯示出來吧:

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

?

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

?

??????// 在OnPaint消息里顯示出來

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

?

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

?

?

?

具體應用技巧

1、打開一張圖
可以通過創(chuàng)建一個新的CxImage對象來完成,通過構造函數(shù)來打開一張圖
CxImage::CxImage(const char * filename, DWORD imagetype)
其中filename是需要打開的文件路徑,imagetype是文件類型,支持的類型有:
CXIMAGE_FORMAT_UNKNOWN,CXIMAGE_FORMAT_BMP,CXIMAGE_FORMAT_GIF,CXIMAGE_FORMAT_JPG,CXIMAGE_FORMAT_PNG,CXIMAGE_FORMAT_MNG,CXIMAGE_FORMAT_ICO,CXIMAGE_FORMAT_TIF,CXIMAGE_FORMAT_TGA,CXIMAGE_FORMAT_PCX,CXIMAGE_FORMAT_WBMP,CXIMAGE_FORMAT_WMF,CXIMAGE_FORMAT_J2K,CXIMAGE_FORMAT_JBG,CXIMAGE_FORMAT_JP2,CXIMAGE_FORMAT_JPC,CXIMAGE_FORMAT_PGX,CXIMAGE_FORMAT_PNM,CXIMAGE_FORMAT_RAS,
當然,這么多格式很難記住,我們可以通過如下函數(shù)來直接獲得文件的格式。
int FindType(const CString& filename)
{
?CString ext = filename.Right(filename.GetLength()-filename.ReverseFind('.')-1);
?int type = 0;
?if (ext == "bmp")?????type = CXIMAGE_FORMAT_BMP;
#if CXIMAGE_SUPPORT_JPG
?else if (ext=="jpg"||ext=="jpeg")?type = CXIMAGE_FORMAT_JPG;
#endif
#if CXIMAGE_SUPPORT_GIF
?else if (ext == "gif")????type = CXIMAGE_FORMAT_GIF;
#endif
#if CXIMAGE_SUPPORT_PNG
?else if (ext == "png")????type = CXIMAGE_FORMAT_PNG;
#endif
#if CXIMAGE_SUPPORT_MNG
?else if (ext=="mng"||ext=="jng")?type = CXIMAGE_FORMAT_MNG;
#endif
#if CXIMAGE_SUPPORT_ICO
?else if (ext == "ico")????type = CXIMAGE_FORMAT_ICO;
#endif
#if CXIMAGE_SUPPORT_TIF
?else if (ext=="tiff"||ext=="tif")?type = CXIMAGE_FORMAT_TIF;
#endif
#if CXIMAGE_SUPPORT_TGA
?else if (ext=="tga")????type = CXIMAGE_FORMAT_TGA;
#endif
#if CXIMAGE_SUPPORT_PCX
?else if (ext=="pcx")????type = CXIMAGE_FORMAT_PCX;
#endif
#if CXIMAGE_SUPPORT_WBMP
?else if (ext=="wbmp")????type = CXIMAGE_FORMAT_WBMP;
#endif
#if CXIMAGE_SUPPORT_WMF
?else if (ext=="wmf"||ext=="emf")?type = CXIMAGE_FORMAT_WMF;
#endif
#if CXIMAGE_SUPPORT_J2K
?else if (ext=="j2k"||ext=="jp2")?type = CXIMAGE_FORMAT_J2K;
#endif
#if CXIMAGE_SUPPORT_JBG
?else if (ext=="jbg")????type = CXIMAGE_FORMAT_JBG;
#endif
#if CXIMAGE_SUPPORT_JP2
?else if (ext=="jp2"||ext=="j2k")?type = CXIMAGE_FORMAT_JP2;
#endif
#if CXIMAGE_SUPPORT_JPC
?else if (ext=="jpc"||ext=="j2c")?type = CXIMAGE_FORMAT_JPC;
#endif
#if CXIMAGE_SUPPORT_PGX
?else if (ext=="pgx")????type = CXIMAGE_FORMAT_PGX;
#endif
#if CXIMAGE_SUPPORT_RAS
?else if (ext=="ras")????type = CXIMAGE_FORMAT_RAS;
#endif
#if CXIMAGE_SUPPORT_PNM
?else if (ext=="pnm"||ext=="pgm"||ext=="ppm") type = CXIMAGE_FORMAT_PNM;
#endif
?else type = CXIMAGE_FORMAT_UNKNOWN;
?
?return type;
}

2、保存一張圖
bool CxImage::Save(LPCWSTR filename, DWORD imagetype=0)
參數(shù)和上面是一樣的。
3、得到圖形數(shù)據(jù),以便在OpenGL中使用材質(zhì)
?BYTE*?CxImage::GetBits(DWORD row = 0);
4、得到圖形大小
long?GetSize();
5、得到圖形高度和寬度
?DWORD?CxImage::GetHeight();
?DWORD?CxImage::GetWidth();
6、得到文件類型
?DWORD?CxImage::GetType()??const;
7、得到最后一個錯誤
?char*?CxImage::GetLastError();
8、在界面中繪制出來
long?CxImage::Draw(HDC hdc, const RECT& rect, RECT* pClipRect=NULL)
HDC 繪圖設備,rect 繪圖的區(qū)域,確定繪圖的左上角和右下角坐標。pClipRect,裁剪區(qū)域,一般可以和繪圖區(qū)域一樣大小,除非特殊需要。

總結(jié)

以上是生活随笔為你收集整理的CxImage类库的简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

歡迎分享!

轉(zhuǎn)載請說明來源于"生活随笔",并保留原作者的名字。

本文地址:CxImage类库的简介