天天看點

C++中圖像處理的類之一 CxImage

CxImage 是一個C++類,可以加載、儲存、顯示,轉換BMP, JPEG, GIF, PNG, TIFF, MNG, ICO, PCX, TGA, WMF, WBMP, JBG, J2K 等格式圖像。     Cximage以位圖為基礎,并附加一些資訊儲存資訊。 Code:

class CxImage

{

...

protected:

void* pDib; //contains the header, the palette, the pixels

BITMAPINFOHEADER head; //standard header

CXIMAGEINFO info; //extended information

BYTE* pSelection; //selected region

BYTE* pAlpha; //alpha channel

CxImage** pLayers; //generic layers

}

CxImage::head 是一個位圖頭,CxImage::pDib 是通常的位圖。CxImage::info 是一個存儲在不同格式之間的許多共享資訊。

Code: typedef struct tagCxImageInfo {

DWORD dwEffWidth; //DWORD aligned scan line width

BYTE* pImage; //THE IMAGE BITS

void* pGhost; //if this is a ghost, pGhost point to the body

DWORD dwType; //original image format

char szLastError[256]; //debugging

long nProgress; //monitor

long nEscape; //escape

long nBkgndIndex; //used for GIF, PNG, MNG

RGBQUAD nBkgndColor; //used for RGB transparency

BYTE nQuality; //used for JPEG

long nFrame; //used for TIF, GIF, MNG : actual frame

long nNumFrames; //used for TIF, GIF, MNG : total number of

//frames

DWORD dwFrameDelay; //used for GIF, MNG

long xDPI; //horizontal resolution

long yDPI; //vertical resolution

RECT rSelectionBox; //bounding rectangle

BYTE nAlphaMax; //max opacity (fade)

bool bAlphaPaletteEnabled; //true if alpha values in the palette are

// enabled.

bool bEnabled; //enables the painting functions

long xOffset;

long yOffset;

DWORD dwEncodeOption; //for GIF, TIF : 0=def.1=unc,2=fax3,3=fax4,

// 4=pack,5=jpg

RGBQUAD last_c; //for GetNearestIndex optimization

BYTE last_c_index;

bool last_c_isvalid;

long nNumLayers;

DWORD dwFlags;

} CXIMAGEINFO;

CxImage對象還是多層的集合。每層的緩沖隻在必要的時候才被配置設定。

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 ...

轉換圖像格式

CxImage::pDib是背景圖,CxImage::pAlpha 是透明層,CxImage::pSelection 是選擇層,用于建立圖像處理的區域。在這三層外,你還可以定義,然後存儲在CxImage::pLayers中。

CxImage類成員和操作

支援的格式和操作

[使用CxImage]

要想使用CxImage,你必須編輯以下設定

Code: 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);

}

加載圖像資源

Code: //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

Code: //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

Code: //Load a bitmap resource;

HBITMAP bitmap = ::LoadBitmap(AfxGetInstanceHandle(),

MAKEINTRESOURCE(IDB_BITMAP1)));

CxImage *newImage = new CxImage();

newImage->CreateFromHBITMAP(bitmap);

解碼記憶體中的圖像

Code: CxImage image((BYTE*)buffer,size,image_type);

or

Code: CxMemFile memfile((BYTE*)buffer,size);

CxImage image(&memfile,image_type);

or

Code: CxMemFile memfile((BYTE*)buffer,size);

CxImage* image = new CxImage();

image->Decode(&memfile,type);

編碼記憶體中的圖像

Code: long size=0;

BYTE* buffer=0;

image.Encode(buffer,size,image_type);

...

free(buffer);

or

Code: CxMemFile memfile;

memfile.Open();

image.Encode(&memfile,image_type);

BYTE* buffer = memfile.GetBuffer();

long size = memfile.Size();

...

free(buffer);

建立一個多頁的TIFF

Code: 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);

or

Code: 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);

拷貝粘貼圖像

Code: //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();

在picture框中顯示圖像檔案

Code:

HBITMAP m_bitmap = NULL;

CxImage image("myfile.png", CXIMAGE_FORMAT_PNG);

...

m_bitmap = image.MakeBitmap(m_picture.GetDC()->m_hDC);

m_picture.SetBitmap(m_bitm

轉載于:https://www.cnblogs.com/milier-otw/archive/2013/03/13/2958061.html