📄 ximaenc.cpp
字号:
// xImaCodec.cpp : Encode Decode functions/* 07/08/2001 v1.00 - Davide Pizzolato - www.xdp.it * CxImage version 5.99c 17/Oct/2004 */#include "ximage.h"#if CXIMAGE_SUPPORT_JPG#include "ximajpg.h"#endif#if CXIMAGE_SUPPORT_GIF#include "ximagif.h"#endif#if CXIMAGE_SUPPORT_PNG#include "ximapng.h"#endif#if CXIMAGE_SUPPORT_MNG#include "ximamng.h"#endif#if CXIMAGE_SUPPORT_BMP#include "ximabmp.h"#endif#if CXIMAGE_SUPPORT_ICO#include "ximaico.h"#endif#if CXIMAGE_SUPPORT_TIF#include "ximatif.h"#endif#if CXIMAGE_SUPPORT_TGA#include "ximatga.h"#endif#if CXIMAGE_SUPPORT_PCX#include "ximapcx.h"#endif#if CXIMAGE_SUPPORT_WBMP#include "ximawbmp.h"#endif#if CXIMAGE_SUPPORT_WMF#include "ximawmf.h" // <vho> - WMF/EMF support#endif#if CXIMAGE_SUPPORT_J2K#include "ximaj2k.h"#endif#if CXIMAGE_SUPPORT_JBG#include "ximajbg.h"#endif#if CXIMAGE_SUPPORT_JASPER#include "ximajas.h"#endif////////////////////////////////////////////////////////////////////////////////#if CXIMAGE_SUPPORT_ENCODE////////////////////////////////////////////////////////////////////////////////bool CxImage::EncodeSafeCheck(CxFile *hFile){ if (hFile==NULL) { strcpy(info.szLastError,CXIMAGE_ERR_NOFILE); return true; } if (pDib==NULL){ strcpy(info.szLastError,CXIMAGE_ERR_NOIMAGE); return true; } return false;}//////////////////////////////////////////////////////////////////////////////////#ifdef WIN32//bool CxImage::Save(LPCWSTR filename, DWORD imagetype)//{// FILE* hFile; //file handle to write the image// if ((hFile=_wfopen(filename,L"wb"))==NULL) return false;// bool bOK = Encode(hFile,imagetype);// fclose(hFile);// return bOK;//}//#endif //WIN32////////////////////////////////////////////////////////////////////////////////// For UNICODE support: char -> TCHAR/** * Saves to disk the image in a specific format. * \param filename: file name * \param imagetype: file format, see ENUM_CXIMAGE_FORMATS * \return true if everything is ok */bool CxImage::Save(const TCHAR * filename, DWORD imagetype){ FILE* hFile; //file handle to write the image#ifdef WIN32 if ((hFile=_tfopen(filename,_T("wb")))==NULL) return false; // For UNICODE support#else if ((hFile=fopen(filename,"wb"))==NULL) return false;#endif bool bOK = Encode(hFile,imagetype); fclose(hFile); return bOK;}/////////////////////////////////////////////////////////////////////////////////** * Saves to disk the image in a specific format. * \param hFile: file handle, open and enabled for writing. * \param imagetype: file format, see ENUM_CXIMAGE_FORMATS * \return true if everything is ok */bool CxImage::Encode(FILE *hFile, DWORD imagetype){ CxIOFile file(hFile); return Encode(&file,imagetype);}/////////////////////////////////////////////////////////////////////////////////** * Saves to memory buffer the image in a specific format. * \param buffer: output memory buffer pointer. Must be NULL, * the function allocates and fill the memory, * the application must free the buffer, see also FreeMemory(). * \param size: output memory buffer size. * \param imagetype: file format, see ENUM_CXIMAGE_FORMATS * \return true if everything is ok */bool CxImage::Encode(BYTE * &buffer, long &size, DWORD imagetype){ if (buffer!=NULL){ strcpy(info.szLastError,"the buffer must be empty"); return false; } CxMemFile file; file.Open(); if(Encode(&file,imagetype)){ buffer=file.GetBuffer(); size=file.Size(); return true; } return false;}/////////////////////////////////////////////////////////////////////////////////** * Saves to disk the image in a specific format. * \param hFile: file handle (implemented using CxMemFile or CxIOFile), * open and enabled for writing. * \param imagetype: file format, see ENUM_CXIMAGE_FORMATS * \return true if everything is ok * \sa ENUM_CXIMAGE_FORMATS */bool CxImage::Encode(CxFile *hFile, DWORD imagetype){#if CXIMAGE_SUPPORT_BMP if (imagetype==CXIMAGE_FORMAT_BMP){ CxImageBMP newima; newima.Ghost(this); if (newima.Encode(hFile)){ return true; } else { strcpy(info.szLastError,newima.GetLastError()); return false; } }#endif#if CXIMAGE_SUPPORT_ICO if (imagetype==CXIMAGE_FORMAT_ICO){ CxImageICO newima; newima.Ghost(this); if (newima.Encode(hFile)){ return true; } else { strcpy(info.szLastError,newima.GetLastError()); return false; } }#endif#if CXIMAGE_SUPPORT_TIF if (imagetype==CXIMAGE_FORMAT_TIF){ CxImageTIF newima; newima.Ghost(this); if (newima.Encode(hFile)){ return true; } else { strcpy(info.szLastError,newima.GetLastError()); return false; } }#endif#if CXIMAGE_SUPPORT_JPG if (imagetype==CXIMAGE_FORMAT_JPG){ CxImageJPG newima; newima.Ghost(this); if (newima.Encode(hFile)){ return true; } else { strcpy(info.szLastError,newima.GetLastError()); return false; } }#endif#if CXIMAGE_SUPPORT_GIF if (imagetype==CXIMAGE_FORMAT_GIF){ CxImageGIF newima; newima.Ghost(this); if (newima.Encode(hFile)){ return true; } else { strcpy(info.szLastError,newima.GetLastError()); return false; } }#endif#if CXIMAGE_SUPPORT_PNG if (imagetype==CXIMAGE_FORMAT_PNG){ CxImagePNG newima; newima.Ghost(this); if (newima.Encode(hFile)){ return true; } else { strcpy(info.szLastError,newima.GetLastError()); return false; } }#endif#if CXIMAGE_SUPPORT_MNG if (imagetype==CXIMAGE_FORMAT_MNG){ CxImageMNG newima; newima.Ghost(this); if (newima.Encode(hFile)){ return true; } else { strcpy(info.szLastError,newima.GetLastError()); return false; } }#endif#if CXIMAGE_SUPPORT_TGA if (imagetype==CXIMAGE_FORMAT_TGA){ CxImageTGA newima; newima.Ghost(this); if (newima.Encode(hFile)){ return true; } else { strcpy(info.szLastError,newima.GetLastError()); return false; } }#endif#if CXIMAGE_SUPPORT_PCX if (imagetype==CXIMAGE_FORMAT_PCX){ CxImagePCX newima; newima.Ghost(this); if (newima.Encode(hFile)){ return true; } else { strcpy(info.szLastError,newima.GetLastError()); return false; } }#endif#if CXIMAGE_SUPPORT_WBMP if (imagetype==CXIMAGE_FORMAT_WBMP){ CxImageWBMP newima; newima.Ghost(this); if (newima.Encode(hFile)){ return true; } else { strcpy(info.szLastError,newima.GetLastError()); return false; } }#endif#if CXIMAGE_SUPPORT_WMF && CXIMAGE_SUPPORT_WINDOWS // <vho> - WMF/EMF support if (imagetype==CXIMAGE_FORMAT_WMF){ CxImageWMF newima; newima.Ghost(this); if (newima.Encode(hFile)){ return true; } else { strcpy(info.szLastError,newima.GetLastError()); return false; } }#endif#if CXIMAGE_SUPPORT_J2K if (imagetype==CXIMAGE_FORMAT_J2K){ CxImageJ2K newima; newima.Ghost(this); if (newima.Encode(hFile)){ return true; } else { strcpy(info.szLastError,newima.GetLastError()); return false; } }#endif#if CXIMAGE_SUPPORT_JBG if (imagetype==CXIMAGE_FORMAT_JBG){ CxImageJBG newima; newima.Ghost(this); if (newima.Encode(hFile)){ return true; } else { strcpy(info.szLastError,newima.GetLastError()); return false; } }#endif#if CXIMAGE_SUPPORT_JASPER if ( #if CXIMAGE_SUPPORT_JP2 imagetype==CXIMAGE_FORMAT_JP2 || #endif #if CXIMAGE_SUPPORT_JPC imagetype==CXIMAGE_FORMAT_JPC || #endif #if CXIMAGE_SUPPORT_PGX imagetype==CXIMAGE_FORMAT_PGX || #endif #if CXIMAGE_SUPPORT_PNM imagetype==CXIMAGE_FORMAT_PNM || #endif #if CXIMAGE_SUPPORT_RAS imagetype==CXIMAGE_FORMAT_RAS || #endif false ){ CxImageJAS newima; newima.Ghost(this); if (newima.Encode(hFile,imagetype)){ return true; } else { strcpy(info.szLastError,newima.GetLastError()); return false; } }#endif strcpy(info.szLastError,"Encode: Unknown format"); return false;}/////////////////////////////////////////////////////////////////////////////////** * Saves to disk or memory pagecount images, referenced by an array of CxImage pointers. * \param hFile: file handle. * \param pImages: array of CxImage pointers. * \param pagecount: number of images. * \param imagetype: can be CXIMAGE_FORMAT_TIF or CXIMAGE_FORMAT_GIF. * \return true if everything is ok */bool CxImage::Encode(FILE * hFile, CxImage ** pImages, int pagecount, DWORD imagetype){ CxIOFile file(hFile); return Encode(&file, pImages, pagecount,imagetype);}/////////////////////////////////////////////////////////////////////////////////** * Saves to disk or memory pagecount images, referenced by an array of CxImage pointers. * \param hFile: file handle (implemented using CxMemFile or CxIOFile). * \param pImages: array of CxImage pointers. * \param pagecount: number of images. * \param imagetype: can be CXIMAGE_FORMAT_TIF or CXIMAGE_FORMAT_GIF. * \return true if everything is ok */bool CxImage::Encode(CxFile * hFile, CxImage ** pImages, int pagecount, DWORD imagetype){#if CXIMAGE_SUPPORT_TIF if (imagetype==CXIMAGE_FORMAT_TIF){ CxImageTIF newima; newima.Ghost(this); if (newima.Encode(hFile,pImages,pagecount)){ return true; } else { strcpy(info.szLastError,newima.GetLastError()); return false; } }#endif#if CXIMAGE_SUPPORT_GIF if (imagetype==CXIMAGE_FORMAT_GIF){ CxImageGIF newima; newima.Ghost(this); if (newima.Encode(hFile,pImages,pagecount)){ return true; } else { strcpy(info.szLastError,newima.GetLastError()); return false; } }#endif strcpy(info.szLastError,"Multipage Encode, Unsupported operation for this format"); return false;}/////////////////////////////////////////////////////////////////////////////////** * exports the image into a RGBA buffer, Useful for OpenGL applications. * \param buffer: output memory buffer pointer. Must be NULL, * the function allocates and fill the memory, * the application must free the buffer, see also FreeMemory(). * \param size: output memory buffer size. * \return true if everything is ok */bool CxImage::Encode2RGBA(BYTE * &buffer, long &size){ if (buffer!=NULL){ strcpy(info.szLastError,"the buffer must be empty"); return false; } CxMemFile file; file.Open(); if(Encode2RGBA(&file)){ buffer=file.GetBuffer(); size=file.Size(); return true; } return false;}/////////////////////////////////////////////////////////////////////////////////** * exports the image into a RGBA buffer, Useful for OpenGL applications. * \param hFile: file handle (implemented using CxMemFile or CxIOFile). * \return true if everything is ok */bool CxImage::Encode2RGBA(CxFile *hFile){ if (EncodeSafeCheck(hFile)) return false; for (DWORD y = GetHeight()-1; (signed long) y > -1; y--) { for(DWORD x = 0; x<GetWidth(); x++) { RGBQUAD color = BlindGetPixelColor(x,y); hFile->PutC(color.rgbRed); hFile->PutC(color.rgbGreen); hFile->PutC(color.rgbBlue); hFile->PutC(color.rgbReserved); } } return true;}////////////////////////////////////////////////////////////////////////////////#endif //CXIMAGE_SUPPORT_ENCODE////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////#if CXIMAGE_SUPPORT_DECODE////////////////////////////////////////////////////////////////////////////////// For UNICODE support: char -> TCHAR/** * Reads from disk the image in a specific format. * - If decoding fails using the specified image format, * the function will try the automatic file format recognition. * * \param filename: file name * \param imagetype: file format, see ENUM_CXIMAGE_FORMATS * \return true if everything is ok */bool CxImage::Load(const TCHAR * filename, DWORD imagetype)//bool CxImage::Load(const char * filename, DWORD imagetype){ /*FILE* hFile; //file handle to read the image if ((hFile=fopen(filename,"rb"))==NULL) return false; bool bOK = Decode(hFile,imagetype); fclose(hFile);*/ /* automatic file type recognition */ bool bOK = false; if ( imagetype > 0 && imagetype < CMAX_IMAGE_FORMATS ){ FILE* hFile; //file handle to read the image#ifdef WIN32 if ((hFile=_tfopen(filename,_T("rb")))==NULL) return false; // For UNICODE support#else if ((hFile=fopen(filename,"rb"))==NULL) return false;#endif bOK = Decode(hFile,imagetype); fclose(hFile); if (bOK) return bOK; } char szError[256]; strcpy(szError,info.szLastError); //save the first error // if failed, try automatic recognition of the file... FILE* hFile;#ifdef WIN32 if ((hFile=_tfopen(filename,_T("rb")))==NULL) return false; // For UNICODE support#else if ((hFile=fopen(filename,"rb"))==NULL) return false;#endif bOK = Decode(hFile,CXIMAGE_FORMAT_UNKNOWN); fclose(hFile); if (!bOK && imagetype > 0) strcpy(info.szLastError,szError); //restore the first error return bOK;}////////////////////////////////////////////////////////////////////////////////#ifdef WIN32
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -