www.pudn.com > transparentdib.zip > cimage.h
// cimage.h : interface of the CImage class // Purpose: Declaration of the Platform Independent Image Class // Author: Alejandro Aguilar Sierra // Created: 1995 // Copyright: (c) 1995, Alejandro Aguilar Sierra// This software is based in part on the work of the Independent JPEG Group. // Modifications by Troels K. aug. 2001 // Modifications by ing.davide.pizzolato@libero.it #ifndef __CIMAGE_H__ #define __CIMAGE_H__ #include #include #include // FILE #ifndef _countof #define _countof(array) (sizeof(array)/sizeof((array)[0])) #endif #ifdef CIMAGE_EXPORTS #define CIMAGE_API __declspec(dllexport) #else #ifdef _IMAGEDLL #define CIMAGE_API __declspec(dllimport) #else #define CIMAGE_API #endif #endif ///////////////////////////////////////////////////////////////////////////// // CImageBase - virtual base class class CIMAGE_API CImageBase { // Attributes public: void* m_handle; //contains the header, the palette, the bits // Construction public: CImageBase(void); // Operations public: BOOL IsOpen(void) const { return (m_handle != NULL) ; } // New virtuals public: virtual ~CImageBase(); virtual void Close(void); virtual BOOL DrawImplementation(HDC hdc, int xDst, int yDst, int cxDst, int cyDst, int xSrc, int ySrc, int cxSrc, int cySrc) = 0; }; ///////////////////////////////////////////////////////////////////////////// // CImage formats enumerator enum cximage_type { ENUM_cimage_format_bmp, ENUM_cimage_format_gif, ENUM_cimage_format_jpeg, ENUM_cimage_format_png, ENUM_cimage_format_icon, ENUM_cimage_format_tiff, ENUM_cimage_format_enumcount, ENUM_cimage_format_empty = -1, }; // needed for png & gif #pragma pack(1) struct rgb_color_struct { BYTE r,g,b; }; #pragma pack() // needed for png & mng #define COLORTYPE_PALETTE 1 #define COLORTYPE_COLOR 2 #define COLORTYPE_ALPHA 4 ///////////////////////////////////////////////////////////////////////////// // CImage class CIMAGE_API CImage : public CImageBase { public: //extensible information collector typedef struct tagCImageInfo { DWORD dwEffWidth; //DWORD aligned scan line width BYTE* pImage; //THE IMAGE BITS void* pGhost; //if this is a ghost, pGhost point to the body // char szFileName[_MAX_PATH]; enum cximage_type dwFileType; //original image format BYTE bColorType; //used for PNG, MNG char szLastError[256]; //debugging int nBkgndIndex; //used for GIF, PNG, MNG BYTE nQuality; //used for JPEG int nFrame; //used for TIF, GIF, MNG : actual frame int nNumFrames; //used for TIF, GIF, MNG : total number of frames DWORD dwFrameDelay; //used for GIF, MNG } CXIMAGEINFO; protected: BITMAPINFOHEADER m_header; //standard header CXIMAGEINFO m_info; //extended information public: CImage(); CImage(enum cximage_type); CImage(DWORD dwWidth, DWORD dwHeight, WORD wBPP); CImage(const CImage&); CImage(HBITMAP, int BPP = -1); //Windows resource CImage(HICON); //Windows resource CImage(HANDLE hMem); //Windows objects (clipboard) CImage(LPCSTR filename, enum cximage_type); CImage(LPCWSTR filename, enum cximage_type); CImage(FILE*, DWORD imagetype=0); CImage& operator=(const CImage&); BOOL Attach(const CImage&); BOOL Detach(CImage* dst); void* Create(DWORD dwWidth, DWORD dwHeight, WORD wBPP); void Clear(BYTE bval=0); BOOL Copy(const CImage& src); HANDLE CopyToHandle(HANDLE hMem); void Transfer(CImage* src); BOOL IsInside(int x, int y); int GetLength(); LPBYTE GetBits(); void EnableTransparency(BOOL bEnable = TRUE); BOOL HasTransparency(void) const; BOOL SetBkColor(COLORREF crTransparent); DWORD GetWidth (void) const; DWORD GetHeight(void) const; SIZE GetSize (void) const; DWORD GetEffWidth() const; DWORD GetColorCount() const; BYTE GetColorType() const; WORD GetBPP() const; enum cximage_type GetFileType(); void SetFileType(enum cximage_type type); LPCSTR GetLastError(); DWORD GetPaletteSize(); int GetPixelIndex(int x,int y); RGBQUAD* GetPalette() const; RGBQUAD GetPaletteIndex(int idx) const; RGBQUAD GetPixelColor(int x,int y); int FindPaletteIndex(COLORREF) const; BOOL GetRGB(int i, BYTE* r, BYTE* g, BYTE* b); BYTE GetNearestIndex(RGBQUAD); BOOL Draw(HDC hdc, int xDst = 0, int yDst = 0, int cxDst = -1, int cyDst = -1, int xSrc = 0, int ySrc = 0, int cxSrc = -1, int cySrc = -1); BOOL Draw(HDC hdc, const POINT&); BOOL Draw(HDC hdc, const RECT&); BOOL Draw(HDC hdc, const RECT& dst, const RECT& src); BOOL Tile(HDC hdc, LPCRECT rc); void BlendPalette(COLORREF cr,int perc); void SetPalette(DWORD n, BYTE *r, BYTE *g, BYTE *b); void SetPalette(const RGBQUAD* pPal,DWORD nColors=256); void SetPalette(const rgb_color_struct *rgb,DWORD nColors=256); BOOL SetPaletteIndex(int idx, BYTE r, BYTE g, BYTE b); BOOL SetPaletteIndex(int idx, RGBQUAD); BOOL SetPaletteIndex(int idx, COLORREF); void SetPixelColor(int x,int y,RGBQUAD); void SetPixelColor(int x,int y,COLORREF); void SetPixelIndex(int x,int y,BYTE i); void SetGreyPalette(); RGBQUAD HSLtoRGB(COLORREF cHSLColor); RGBQUAD RGB2RGBQUAD(COLORREF); COLORREF RGBQUAD2RGB (RGBQUAD); RGBQUAD RGBtoHSL(RGBQUAD lRGBColor); RGBQUAD HSLtoRGB(RGBQUAD lHSLColor); void RGB2BGR(BYTE *buffer, int length); BOOL CreateFromFile(LPCSTR filename, enum cximage_type); BOOL CreateFromFile(LPCWSTR filename, enum cximage_type); BOOL Save(LPCSTR filename, enum cximage_type); BOOL Save(LPCWSTR filename, enum cximage_type); // New virtuals public: virtual BOOL Read (FILE*, enum cximage_type); virtual BOOL Write(FILE*, enum cximage_type); BOOL LoadResource(HRSRC hRes, enum cximage_type, HMODULE hModule = NULL); HBITMAP MakeBitmap(); // Operations - special effects public: BOOL Flip(); BOOL Mirror(); BOOL Negative(); BOOL GreyScale(); BOOL Rotate(double angle); BOOL Exchange(COLORREF, COLORREF); BOOL WalkColors(COLORREF(*manipulate)(BYTE r, BYTE g, BYTE b, LPVOID), LPVOID lpUser = NULL); const CXIMAGEINFO* GetInfo (void) { return &m_info; } const BITMAPINFO * GetBitmapInfo(void) { return (const BITMAPINFO*)m_handle; } // Implementation public: virtual void Close(void); virtual ~CImage(); virtual BOOL DrawImplementation(HDC hdc, int xDst, int yDst, int cxDst, int cyDst, int xSrc, int ySrc, int cxSrc, int cySrc); protected: void Startup(); void Ghost(CImage *src); WORD HueToRGB(WORD n1,WORD n2,WORD hue); }; #include "cimage.inl" #endif // __CIMAGE_H__