ximage.h
上传用户:pass2008
上传日期:2021-07-05
资源大小:3299k
文件大小:28k
源码类别:

Internet/IE编程

开发平台:

Visual C++

  1. /*
  2.  * File: ximage.h
  3.  * Purpose: General Purpose Image Class 
  4.  */
  5. /*
  6.   --------------------------------------------------------------------------------
  7. COPYRIGHT NOTICE, DISCLAIMER, and LICENSE:
  8. CxImage version 6.0.0 02/Feb/2008
  9. CxImage : Copyright (C) 2001 - 2008, Davide Pizzolato
  10. Original CImage and CImageIterator implementation are:
  11. Copyright (C) 1995, Alejandro Aguilar Sierra (asierra(at)servidor(dot)unam(dot)mx)
  12. Covered code is provided under this license on an "as is" basis, without warranty
  13. of any kind, either expressed or implied, including, without limitation, warranties
  14. that the covered code is free of defects, merchantable, fit for a particular purpose
  15. or non-infringing. The entire risk as to the quality and performance of the covered
  16. code is with you. Should any covered code prove defective in any respect, you (not
  17. the initial developer or any other contributor) assume the cost of any necessary
  18. servicing, repair or correction. This disclaimer of warranty constitutes an essential
  19. part of this license. No use of any covered code is authorized hereunder except under
  20. this disclaimer.
  21. Permission is hereby granted to use, copy, modify, and distribute this
  22. source code, or portions hereof, for any purpose, including commercial applications,
  23. freely and without fee, subject to the following restrictions: 
  24. 1. The origin of this software must not be misrepresented; you must not
  25. claim that you wrote the original software. If you use this software
  26. in a product, an acknowledgment in the product documentation would be
  27. appreciated but is not required.
  28. 2. Altered source versions must be plainly marked as such, and must not be
  29. misrepresented as being the original software.
  30. 3. This notice may not be removed or altered from any source distribution.
  31.   --------------------------------------------------------------------------------
  32. Other information about CxImage, and the latest version, can be found at the
  33. CxImage home page: http://www.xdp.it/cximage/
  34.   --------------------------------------------------------------------------------
  35.  */
  36. #if !defined(__CXIMAGE_H)
  37. #define __CXIMAGE_H
  38. #if _MSC_VER > 1000
  39. #pragma once
  40. #endif 
  41. /////////////////////////////////////////////////////////////////////////////
  42. #include "xfile.h"
  43. #include "xiofile.h"
  44. #include "xmemfile.h"
  45. #include "ximadef.h" //<vho> adjust some #define
  46. /* see "ximacfg.h" for CxImage configuration options */
  47. /////////////////////////////////////////////////////////////////////////////
  48. // CxImage formats enumerator
  49. enum ENUM_CXIMAGE_FORMATS{
  50. CXIMAGE_FORMAT_UNKNOWN = 0,
  51. #if CXIMAGE_SUPPORT_BMP
  52. CXIMAGE_FORMAT_BMP = 1,
  53. #endif
  54. #if CXIMAGE_SUPPORT_GIF
  55. CXIMAGE_FORMAT_GIF = 2,
  56. #endif
  57. #if CXIMAGE_SUPPORT_JPG
  58. CXIMAGE_FORMAT_JPG = 3,
  59. #endif
  60. #if CXIMAGE_SUPPORT_PNG
  61. CXIMAGE_FORMAT_PNG = 4,
  62. #endif
  63. #if CXIMAGE_SUPPORT_ICO
  64. CXIMAGE_FORMAT_ICO = 5,
  65. #endif
  66. #if CXIMAGE_SUPPORT_TIF
  67. CXIMAGE_FORMAT_TIF = 6,
  68. #endif
  69. #if CXIMAGE_SUPPORT_TGA
  70. CXIMAGE_FORMAT_TGA = 7,
  71. #endif
  72. #if CXIMAGE_SUPPORT_PCX
  73. CXIMAGE_FORMAT_PCX = 8,
  74. #endif
  75. #if CXIMAGE_SUPPORT_WBMP
  76. CXIMAGE_FORMAT_WBMP = 9,
  77. #endif
  78. #if CXIMAGE_SUPPORT_WMF
  79. CXIMAGE_FORMAT_WMF = 10,
  80. #endif
  81. #if CXIMAGE_SUPPORT_JP2
  82. CXIMAGE_FORMAT_JP2 = 11,
  83. #endif
  84. #if CXIMAGE_SUPPORT_JPC
  85. CXIMAGE_FORMAT_JPC = 12,
  86. #endif
  87. #if CXIMAGE_SUPPORT_PGX
  88. CXIMAGE_FORMAT_PGX = 13,
  89. #endif
  90. #if CXIMAGE_SUPPORT_PNM
  91. CXIMAGE_FORMAT_PNM = 14,
  92. #endif
  93. #if CXIMAGE_SUPPORT_RAS
  94. CXIMAGE_FORMAT_RAS = 15,
  95. #endif
  96. #if CXIMAGE_SUPPORT_JBG
  97. CXIMAGE_FORMAT_JBG = 16,
  98. #endif
  99. #if CXIMAGE_SUPPORT_MNG
  100. CXIMAGE_FORMAT_MNG = 17,
  101. #endif
  102. #if CXIMAGE_SUPPORT_SKA
  103. CXIMAGE_FORMAT_SKA = 18,
  104. #endif
  105. #if CXIMAGE_SUPPORT_RAW
  106. CXIMAGE_FORMAT_RAW = 19,
  107. #endif
  108. CMAX_IMAGE_FORMATS = CXIMAGE_SUPPORT_BMP + CXIMAGE_SUPPORT_GIF + CXIMAGE_SUPPORT_JPG +
  109.  CXIMAGE_SUPPORT_PNG + CXIMAGE_SUPPORT_MNG + CXIMAGE_SUPPORT_ICO +
  110.  CXIMAGE_SUPPORT_TIF + CXIMAGE_SUPPORT_TGA + CXIMAGE_SUPPORT_PCX +
  111.  CXIMAGE_SUPPORT_WBMP+ CXIMAGE_SUPPORT_WMF +
  112.  CXIMAGE_SUPPORT_JBG + CXIMAGE_SUPPORT_JP2 + CXIMAGE_SUPPORT_JPC +
  113.  CXIMAGE_SUPPORT_PGX + CXIMAGE_SUPPORT_PNM + CXIMAGE_SUPPORT_RAS +
  114.  CXIMAGE_SUPPORT_SKA + CXIMAGE_SUPPORT_RAW + 1
  115. };
  116. /////////////////////////////////////////////////////////////////////////////
  117. // CxImage class
  118. /////////////////////////////////////////////////////////////////////////////
  119. class DLL_EXP CxImage
  120. {
  121. //extensible information collector
  122. typedef struct tagCxImageInfo {
  123. DWORD dwEffWidth; ///< DWORD aligned scan line width
  124. BYTE* pImage; ///< THE IMAGE BITS
  125. CxImage* pGhost; ///< if this is a ghost, pGhost points to the body
  126. CxImage* pParent; ///< if this is a layer, pParent points to the body
  127. DWORD dwType; ///< original image format
  128. char szLastError[256]; ///< debugging
  129. long nProgress; ///< monitor
  130. long nEscape; ///< escape
  131. long nBkgndIndex; ///< used for GIF, PNG, MNG
  132. RGBQUAD nBkgndColor; ///< used for RGB transparency
  133. float fQuality; ///< used for JPEG, JPEG2000 (0.0f ... 100.0f)
  134. BYTE nJpegScale; ///< used for JPEG [ignacio]
  135. long nFrame; ///< used for TIF, GIF, MNG : actual frame
  136. long nNumFrames; ///< used for TIF, GIF, MNG : total number of frames
  137. DWORD dwFrameDelay; ///< used for GIF, MNG
  138. long xDPI; ///< horizontal resolution
  139. long yDPI; ///< vertical resolution
  140. RECT rSelectionBox; ///< bounding rectangle
  141. BYTE nAlphaMax; ///< max opacity (fade)
  142. bool bAlphaPaletteEnabled; ///< true if alpha values in the palette are enabled.
  143. bool bEnabled; ///< enables the painting functions
  144. long xOffset;
  145. long yOffset;
  146. DWORD dwCodecOpt[CMAX_IMAGE_FORMATS]; ///< for GIF, TIF : 0=def.1=unc,2=fax3,3=fax4,4=pack,5=jpg
  147. RGBQUAD last_c; ///< for GetNearestIndex optimization
  148. BYTE last_c_index;
  149. bool last_c_isvalid;
  150. long nNumLayers;
  151. DWORD dwFlags; ///< 0x??00000 = reserved, 0x00??0000 = blend mode, 0x0000???? = layer id - user flags
  152. BYTE dispmeth;
  153. bool bGetAllFrames;
  154. bool bLittleEndianHost;
  155. } CXIMAGEINFO;
  156. public:
  157. //public structures
  158. struct rgb_color { BYTE r,g,b; };
  159. #if CXIMAGE_SUPPORT_WINDOWS
  160. // <VATI> text placement data
  161. // members must be initialized with the InitTextInfo(&this) function.
  162. typedef struct tagCxTextInfo
  163. {
  164. #if defined (_WIN32_WCE)
  165. TCHAR    text[256];  ///< text for windows CE
  166. #else
  167. TCHAR    text[4096]; ///< text (char -> TCHAR for UNICODE [Cesar M])
  168. #endif
  169. LOGFONT  lfont;      ///< font and codepage data
  170.     COLORREF fcolor;     ///< foreground color
  171.     long     align;      ///< DT_CENTER, DT_RIGHT, DT_LEFT aligment for multiline text
  172.     BYTE     smooth;     ///< text smoothing option. Default is false.
  173.     BYTE     opaque;     ///< text has background or hasn't. Default is true.
  174.  ///< data for background (ignored if .opaque==FALSE) 
  175.     COLORREF bcolor;     ///< background color
  176.     float    b_opacity;  ///< opacity value for background between 0.0-1.0 Default is 0. (opaque)
  177.     BYTE     b_outline;  ///< outline width for background (zero: no outline)
  178.     BYTE     b_round;    ///< rounding radius for background rectangle. % of the height, between 0-50. Default is 10.
  179.                          ///< (backgr. always has a frame: width = 3 pixel + 10% of height by default.)
  180. } CXTEXTINFO;
  181. #endif
  182. public:
  183. /** addtogroup Constructors */ //@{
  184. CxImage(DWORD imagetype = 0);
  185. CxImage(DWORD dwWidth, DWORD dwHeight, DWORD wBpp, DWORD imagetype = 0);
  186. CxImage(const CxImage &src, bool copypixels = true, bool copyselection = true, bool copyalpha = true);
  187. CxImage(const TCHAR * filename, DWORD imagetype); // For UNICODE support: char -> TCHAR
  188. CxImage(FILE * stream, DWORD imagetype);
  189. CxImage(CxFile * stream, DWORD imagetype);
  190. CxImage(BYTE * buffer, DWORD size, DWORD imagetype);
  191. virtual ~CxImage() { DestroyFrames(); Destroy(); };
  192. CxImage& operator = (const CxImage&);
  193. //@}
  194. /** addtogroup Initialization */ //@{
  195. void* Create(DWORD dwWidth, DWORD dwHeight, DWORD wBpp, DWORD imagetype = 0);
  196. bool Destroy();
  197. bool DestroyFrames();
  198. void Clear(BYTE bval=0);
  199. void Copy(const CxImage &src, bool copypixels = true, bool copyselection = true, bool copyalpha = true);
  200. bool Transfer(CxImage &from, bool bTransferFrames = true);
  201. bool CreateFromArray(BYTE* pArray,DWORD dwWidth,DWORD dwHeight,DWORD dwBitsperpixel, DWORD dwBytesperline, bool bFlipImage);
  202. bool CreateFromMatrix(BYTE** ppMatrix,DWORD dwWidth,DWORD dwHeight,DWORD dwBitsperpixel, DWORD dwBytesperline, bool bFlipImage);
  203. void FreeMemory(void* memblock);
  204. DWORD Dump(BYTE * dst);
  205. DWORD UnDump(const BYTE * src);
  206. DWORD DumpSize();
  207. //@}
  208. /** addtogroup Attributes */ //@{
  209. long GetSize();
  210. BYTE* GetBits(DWORD row = 0);
  211. BYTE GetColorType();
  212. void* GetDIB() const;
  213. DWORD GetHeight() const;
  214. DWORD GetWidth() const;
  215. DWORD GetEffWidth() const;
  216. DWORD GetNumColors() const;
  217. WORD GetBpp() const;
  218. DWORD GetType() const;
  219. const char* GetLastError();
  220. static const TCHAR* GetVersion();
  221. static const float GetVersionNumber();
  222. DWORD GetFrameDelay() const;
  223. void SetFrameDelay(DWORD d);
  224. void GetOffset(long *x,long *y);
  225. void SetOffset(long x,long y);
  226. BYTE GetJpegQuality() const;
  227. void SetJpegQuality(BYTE q);
  228. float GetJpegQualityF() const;
  229. void SetJpegQualityF(float q);
  230. BYTE GetJpegScale() const;
  231. void SetJpegScale(BYTE q);
  232. long GetXDPI() const;
  233. long GetYDPI() const;
  234. void SetXDPI(long dpi);
  235. void SetYDPI(long dpi);
  236. DWORD GetClrImportant() const;
  237. void SetClrImportant(DWORD ncolors = 0);
  238. long GetProgress() const;
  239. long GetEscape() const;
  240. void SetProgress(long p);
  241. void SetEscape(long i);
  242. long GetTransIndex() const;
  243. RGBQUAD GetTransColor();
  244. void SetTransIndex(long idx);
  245. void SetTransColor(RGBQUAD rgb);
  246. bool IsTransparent() const;
  247. DWORD GetCodecOption(DWORD imagetype = 0);
  248. bool SetCodecOption(DWORD opt, DWORD imagetype = 0);
  249. DWORD GetFlags() const;
  250. void SetFlags(DWORD flags, bool bLockReservedFlags = true);
  251. BYTE GetDisposalMethod() const;
  252. void SetDisposalMethod(BYTE dm);
  253. bool SetType(DWORD type);
  254. static DWORD GetNumTypes();
  255. static DWORD GetTypeIdFromName(const TCHAR* ext);
  256. static DWORD GetTypeIdFromIndex(const DWORD index);
  257. static DWORD GetTypeIndexFromId(const DWORD id);
  258. bool GetRetreiveAllFrames() const;
  259. void SetRetreiveAllFrames(bool flag);
  260. CxImage * GetFrame(long nFrame) const;
  261. //void* GetUserData() const {return info.pUserData;}
  262. //void SetUserData(void* pUserData) {info.pUserData = pUserData;}
  263. //@}
  264. /** addtogroup Palette
  265.  * These functions have no effects on RGB images and in this case the returned value is always 0.
  266.  * @{ */
  267. bool IsGrayScale();
  268. bool IsIndexed() const;
  269. bool IsSamePalette(CxImage &img, bool bCheckAlpha = true);
  270. DWORD GetPaletteSize();
  271. RGBQUAD* GetPalette() const;
  272. RGBQUAD GetPaletteColor(BYTE idx);
  273. bool GetPaletteColor(BYTE i, BYTE* r, BYTE* g, BYTE* b);
  274. BYTE GetNearestIndex(RGBQUAD c);
  275. void BlendPalette(COLORREF cr,long perc);
  276. void SetGrayPalette();
  277. void SetPalette(DWORD n, BYTE *r, BYTE *g, BYTE *b);
  278. void SetPalette(RGBQUAD* pPal,DWORD nColors=256);
  279. void SetPalette(rgb_color *rgb,DWORD nColors=256);
  280. void SetPaletteColor(BYTE idx, BYTE r, BYTE g, BYTE b, BYTE alpha=0);
  281. void SetPaletteColor(BYTE idx, RGBQUAD c);
  282. void SetPaletteColor(BYTE idx, COLORREF cr);
  283. void SwapIndex(BYTE idx1, BYTE idx2);
  284. void SwapRGB2BGR();
  285. void SetStdPalette();
  286. //@}
  287. /** addtogroup Pixel */ //@{
  288. bool IsInside(long x, long y);
  289. bool IsTransparent(long x,long y);
  290. bool GetTransparentMask(CxImage* iDst = 0);
  291. RGBQUAD GetPixelColor(long x,long y, bool bGetAlpha = true);
  292. BYTE GetPixelIndex(long x,long y);
  293. BYTE GetPixelGray(long x, long y);
  294. void SetPixelColor(long x,long y,RGBQUAD c, bool bSetAlpha = false);
  295. void SetPixelColor(long x,long y,COLORREF cr);
  296. void SetPixelIndex(long x,long y,BYTE i);
  297. void DrawLine(int StartX, int EndX, int StartY, int EndY, RGBQUAD color, bool bSetAlpha=false);
  298. void DrawLine(int StartX, int EndX, int StartY, int EndY, COLORREF cr);
  299. void BlendPixelColor(long x,long y,RGBQUAD c, float blend, bool bSetAlpha = false);
  300. //@}
  301. protected:
  302. /** addtogroup Protected */ //@{
  303. BYTE BlindGetPixelIndex(const long x,const long y);
  304. RGBQUAD BlindGetPixelColor(const long x,const long y, bool bGetAlpha = true);
  305. void *BlindGetPixelPointer(const long x,const  long y);
  306. void BlindSetPixelColor(long x,long y,RGBQUAD c, bool bSetAlpha = false);
  307. void BlindSetPixelIndex(long x,long y,BYTE i);
  308. //@}
  309. public:
  310. #if CXIMAGE_SUPPORT_INTERPOLATION
  311. /** addtogroup Interpolation */ //@{
  312. //overflow methods:
  313. enum OverflowMethod {
  314. OM_COLOR=1,
  315. OM_BACKGROUND=2,
  316. OM_TRANSPARENT=3,
  317. OM_WRAP=4,
  318. OM_REPEAT=5,
  319. OM_MIRROR=6
  320. };
  321. void OverflowCoordinates(float &x, float &y, OverflowMethod const ofMethod);
  322. void OverflowCoordinates(long  &x, long &y, OverflowMethod const ofMethod);
  323. RGBQUAD GetPixelColorWithOverflow(long x, long y, OverflowMethod const ofMethod=OM_BACKGROUND, RGBQUAD* const rplColor=0);
  324. //interpolation methods:
  325. enum InterpolationMethod {
  326. IM_NEAREST_NEIGHBOUR=1,
  327. IM_BILINEAR =2,
  328. IM_BSPLINE =3,
  329. IM_BICUBIC =4,
  330. IM_BICUBIC2 =5,
  331. IM_LANCZOS =6,
  332. IM_BOX =7,
  333. IM_HERMITE =8,
  334. IM_HAMMING =9,
  335. IM_SINC =10,
  336. IM_BLACKMAN =11,
  337. IM_BESSEL =12,
  338. IM_GAUSSIAN =13,
  339. IM_QUADRATIC =14,
  340. IM_MITCHELL =15,
  341. IM_CATROM =16,
  342. IM_HANNING =17,
  343. IM_POWER =18
  344. };
  345. RGBQUAD GetPixelColorInterpolated(float x,float y, InterpolationMethod const inMethod=IM_BILINEAR, OverflowMethod const ofMethod=OM_BACKGROUND, RGBQUAD* const rplColor=0);
  346. RGBQUAD GetAreaColorInterpolated(float const xc, float const yc, float const w, float const h, InterpolationMethod const inMethod, OverflowMethod const ofMethod=OM_BACKGROUND, RGBQUAD* const rplColor=0);
  347. //@}
  348. protected:
  349. /** addtogroup Protected */ //@{
  350. void  AddAveragingCont(RGBQUAD const &color, float const surf, float &rr, float &gg, float &bb, float &aa);
  351. //@}
  352. /** addtogroup Kernels */ //@{
  353. public:
  354. static float KernelBSpline(const float x);
  355. static float KernelLinear(const float t);
  356. static float KernelCubic(const float t);
  357. static float KernelGeneralizedCubic(const float t, const float a=-1);
  358. static float KernelLanczosSinc(const float t, const float r = 3);
  359. static float KernelBox(const float x);
  360. static float KernelHermite(const float x);
  361. static float KernelHamming(const float x);
  362. static float KernelSinc(const float x);
  363. static float KernelBlackman(const float x);
  364. static float KernelBessel_J1(const float x);
  365. static float KernelBessel_P1(const float x);
  366. static float KernelBessel_Q1(const float x);
  367. static float KernelBessel_Order1(float x);
  368. static float KernelBessel(const float x);
  369. static float KernelGaussian(const float x);
  370. static float KernelQuadratic(const float x);
  371. static float KernelMitchell(const float x);
  372. static float KernelCatrom(const float x);
  373. static float KernelHanning(const float x);
  374. static float KernelPower(const float x, const float a = 2);
  375. //@}
  376. #endif //CXIMAGE_SUPPORT_INTERPOLATION
  377. /** addtogroup Painting */ //@{
  378. #if CXIMAGE_SUPPORT_WINDOWS
  379. long Blt(HDC pDC, long x=0, long y=0);
  380. HBITMAP MakeBitmap(HDC hdc = NULL);
  381. HANDLE CopyToHandle();
  382. bool CreateFromHANDLE(HANDLE hMem); //Windows objects (clipboard)
  383. bool CreateFromHBITMAP(HBITMAP hbmp, HPALETTE hpal=0); //Windows resource
  384. bool CreateFromHICON(HICON hico);
  385. long Draw(HDC hdc, long x=0, long y=0, long cx = -1, long cy = -1, RECT* pClipRect = 0, bool bSmooth = false);
  386. long Draw(HDC hdc, const RECT& rect, RECT* pClipRect=NULL, bool bSmooth = false);
  387. long Stretch(HDC hdc, long xoffset, long yoffset, long xsize, long ysize, DWORD dwRop = SRCCOPY);
  388. long Stretch(HDC hdc, const RECT& rect, DWORD dwRop = SRCCOPY);
  389. long Tile(HDC hdc, RECT *rc);
  390. long Draw2(HDC hdc, long x=0, long y=0, long cx = -1, long cy = -1);
  391. long Draw2(HDC hdc, const RECT& rect);
  392. //long DrawString(HDC hdc, long x, long y, const char* text, RGBQUAD color, const char* font, long lSize=0, long lWeight=400, BYTE bItalic=0, BYTE bUnderline=0, bool bSetAlpha=false);
  393. long DrawString(HDC hdc, long x, long y, const TCHAR* text, RGBQUAD color, const TCHAR* font, long lSize=0, long lWeight=400, BYTE bItalic=0, BYTE bUnderline=0, bool bSetAlpha=false);
  394. // <VATI> extensions
  395. long    DrawStringEx(HDC hdc, long x, long y, CXTEXTINFO *pTextType, bool bSetAlpha=false );
  396. void    InitTextInfo( CXTEXTINFO *txt );
  397. #endif //CXIMAGE_SUPPORT_WINDOWS
  398. //@}
  399. // file operations
  400. #if CXIMAGE_SUPPORT_DECODE
  401. /** addtogroup Decode */ //@{
  402. #ifdef WIN32
  403. //bool Load(LPCWSTR filename, DWORD imagetype=0);
  404. bool LoadResource(HRSRC hRes, DWORD imagetype, HMODULE hModule=NULL);
  405. #endif
  406. // For UNICODE support: char -> TCHAR
  407. bool Load(const TCHAR* filename, DWORD imagetype=0);
  408. //bool Load(const char * filename, DWORD imagetype=0);
  409. bool Decode(FILE * hFile, DWORD imagetype);
  410. bool Decode(CxFile * hFile, DWORD imagetype);
  411. bool Decode(BYTE * buffer, DWORD size, DWORD imagetype);
  412. bool CheckFormat(CxFile * hFile, DWORD imagetype = 0);
  413. bool CheckFormat(BYTE * buffer, DWORD size, DWORD imagetype = 0);
  414. //@}
  415. #endif //CXIMAGE_SUPPORT_DECODE
  416. #if CXIMAGE_SUPPORT_ENCODE
  417. protected:
  418. /** addtogroup Protected */ //@{
  419. bool EncodeSafeCheck(CxFile *hFile);
  420. //@}
  421. public:
  422. /** addtogroup Encode */ //@{
  423. #ifdef WIN32
  424. //bool Save(LPCWSTR filename, DWORD imagetype=0);
  425. #endif
  426. // For UNICODE support: char -> TCHAR
  427. bool Save(const TCHAR* filename, DWORD imagetype);
  428. //bool Save(const char * filename, DWORD imagetype=0);
  429. bool Encode(FILE * hFile, DWORD imagetype);
  430. bool Encode(CxFile * hFile, DWORD imagetype);
  431. bool Encode(CxFile * hFile, CxImage ** pImages, int pagecount, DWORD imagetype);
  432. bool Encode(FILE *hFile, CxImage ** pImages, int pagecount, DWORD imagetype);
  433. bool Encode(BYTE * &buffer, long &size, DWORD imagetype);
  434. bool Encode2RGBA(CxFile *hFile, bool bFlipY = false);
  435. bool Encode2RGBA(BYTE * &buffer, long &size, bool bFlipY = false);
  436. //@}
  437. #endif //CXIMAGE_SUPPORT_ENCODE
  438. /** addtogroup Attributes */ //@{
  439. //misc.
  440. bool IsValid() const;
  441. bool IsEnabled() const;
  442. void Enable(bool enable=true);
  443. // frame operations
  444. long GetNumFrames() const;
  445. long GetFrame() const;
  446. void SetFrame(long nFrame);
  447. //@}
  448. #if CXIMAGE_SUPPORT_BASICTRANSFORMATIONS
  449. /** addtogroup BasicTransformations */ //@{
  450. bool GrayScale();
  451. bool Flip(bool bFlipSelection = false, bool bFlipAlpha = true);
  452. bool Mirror(bool bMirrorSelection = false, bool bMirrorAlpha = true);
  453. bool Negative();
  454. bool RotateLeft(CxImage* iDst = NULL);
  455. bool RotateRight(CxImage* iDst = NULL);
  456. //@}
  457. #endif //CXIMAGE_SUPPORT_BASICTRANSFORMATIONS
  458. #if CXIMAGE_SUPPORT_TRANSFORMATION
  459. /** addtogroup Transformations */ //@{
  460. // image operations
  461. bool Rotate(float angle, CxImage* iDst = NULL);
  462. bool Rotate2(float angle, CxImage *iDst = NULL, InterpolationMethod inMethod=IM_BILINEAR,
  463.                 OverflowMethod ofMethod=OM_BACKGROUND, RGBQUAD *replColor=0,
  464.                 bool const optimizeRightAngles=true, bool const bKeepOriginalSize=false);
  465. bool Rotate180(CxImage* iDst = NULL);
  466. bool Resample(long newx, long newy, int mode = 1, CxImage* iDst = NULL);
  467. bool Resample2(long newx, long newy, InterpolationMethod const inMethod=IM_BICUBIC2,
  468. OverflowMethod const ofMethod=OM_REPEAT, CxImage* const iDst = NULL,
  469. bool const disableAveraging=false);
  470. bool DecreaseBpp(DWORD nbit, bool errordiffusion, RGBQUAD* ppal = 0, DWORD clrimportant = 0);
  471. bool IncreaseBpp(DWORD nbit);
  472. bool Dither(long method = 0);
  473. bool Crop(long left, long top, long right, long bottom, CxImage* iDst = NULL);
  474. bool Crop(const RECT& rect, CxImage* iDst = NULL);
  475. bool CropRotatedRectangle( long topx, long topy, long width, long height, float angle, CxImage* iDst = NULL);
  476. bool Skew(float xgain, float ygain, long xpivot=0, long ypivot=0, bool bEnableInterpolation = false);
  477. bool Expand(long left, long top, long right, long bottom, RGBQUAD canvascolor, CxImage* iDst = 0);
  478. bool Expand(long newx, long newy, RGBQUAD canvascolor, CxImage* iDst = 0);
  479. bool Thumbnail(long newx, long newy, RGBQUAD canvascolor, CxImage* iDst = 0);
  480. bool CircleTransform(int type,long rmax=0,float Koeff=1.0f);
  481. bool RedEyeRemove(float strength = 0.8f);
  482. bool QIShrink(long newx, long newy, CxImage* const iDst = NULL, bool bChangeBpp = false);
  483. //@}
  484. #endif //CXIMAGE_SUPPORT_TRANSFORMATION
  485. #if CXIMAGE_SUPPORT_DSP
  486. /** addtogroup DSP */ //@{
  487. bool Contour();
  488. bool HistogramStretch(long method = 0, double threshold = 0);
  489. bool HistogramEqualize();
  490. bool HistogramNormalize();
  491. bool HistogramRoot();
  492. bool HistogramLog();
  493. long Histogram(long* red, long* green = 0, long* blue = 0, long* gray = 0, long colorspace = 0);
  494. bool Jitter(long radius=2);
  495. bool Repair(float radius = 0.25f, long niterations = 1, long colorspace = 0);
  496. bool Combine(CxImage* r,CxImage* g,CxImage* b,CxImage* a, long colorspace = 0);
  497. bool FFT2(CxImage* srcReal, CxImage* srcImag, CxImage* dstReal, CxImage* dstImag, long direction = 1, bool bForceFFT = true, bool bMagnitude = true);
  498. bool Noise(long level);
  499. bool Median(long Ksize=3);
  500. bool Gamma(float gamma);
  501. bool GammaRGB(float gammaR, float gammaG, float gammaB);
  502. bool ShiftRGB(long r, long g, long b);
  503. bool Threshold(BYTE level);
  504. bool Threshold(CxImage* pThresholdMask);
  505. bool Threshold2(BYTE level, bool bDirection, RGBQUAD nBkgndColor, bool bSetAlpha = false);
  506. bool Colorize(BYTE hue, BYTE sat, float blend = 1.0f);
  507. bool Light(long brightness, long contrast = 0);
  508. float Mean();
  509. bool Filter(long* kernel, long Ksize, long Kfactor, long Koffset);
  510. bool Erode(long Ksize=2);
  511. bool Dilate(long Ksize=2);
  512. bool Edge(long Ksize=2);
  513. void HuePalette(float correction=1);
  514. enum ImageOpType { OpAdd, OpAnd, OpXor, OpOr, OpMask, OpSrcCopy, OpDstCopy, OpSub, OpSrcBlend, OpScreen, OpAvg };
  515. void Mix(CxImage & imgsrc2, ImageOpType op, long lXOffset = 0, long lYOffset = 0, bool bMixAlpha = false);
  516. void MixFrom(CxImage & imagesrc2, long lXOffset, long lYOffset);
  517. bool UnsharpMask(float radius = 5.0f, float amount = 0.5f, int threshold = 0);
  518. bool Lut(BYTE* pLut);
  519. bool Lut(BYTE* pLutR, BYTE* pLutG, BYTE* pLutB, BYTE* pLutA = 0);
  520. bool GaussianBlur(float radius = 1.0f, CxImage* iDst = 0);
  521. bool TextBlur(BYTE threshold = 100, BYTE decay = 2, BYTE max_depth = 5, bool bBlurHorizontal = true, bool bBlurVertical = true, CxImage* iDst = 0);
  522. bool SelectiveBlur(float radius = 1.0f, BYTE threshold = 25, CxImage* iDst = 0);
  523. bool Solarize(BYTE level = 128, bool bLinkedChannels = true);
  524. bool FloodFill(const long xStart, const long yStart, const RGBQUAD cFillColor, const BYTE tolerance = 0,
  525. BYTE nOpacity = 255, const bool bSelectFilledArea = false, const BYTE nSelectionLevel = 255);
  526. bool Saturate(const long saturation, const long colorspace = 1);
  527. bool ConvertColorSpace(const long dstColorSpace, const long srcColorSpace);
  528. int  OptimalThreshold(long method = 0, RECT * pBox = 0, CxImage* pContrastMask = 0);
  529. bool AdaptiveThreshold(long method = 0, long nBoxSize = 64, CxImage* pContrastMask = 0, long nBias = 0, float fGlobalLocalBalance = 0.5f);
  530. //@}
  531. protected:
  532. /** addtogroup Protected */ //@{
  533. bool IsPowerof2(long x);
  534. bool FFT(int dir,int m,double *x,double *y);
  535. bool DFT(int dir,long m,double *x1,double *y1,double *x2,double *y2);
  536. bool RepairChannel(CxImage *ch, float radius);
  537. // <nipper>
  538. int gen_convolve_matrix (float radius, float **cmatrix_p);
  539. float* gen_lookup_table (float *cmatrix, int cmatrix_length);
  540. void blur_line (float *ctable, float *cmatrix, int cmatrix_length, BYTE* cur_col, BYTE* dest_col, int y, long bytes);
  541. void blur_text (BYTE threshold, BYTE decay, BYTE max_depth, CxImage* iSrc, CxImage* iDst, BYTE bytes);
  542. //@}
  543. public:
  544. /** addtogroup ColorSpace */ //@{
  545. bool SplitRGB(CxImage* r,CxImage* g,CxImage* b);
  546. bool SplitYUV(CxImage* y,CxImage* u,CxImage* v);
  547. bool SplitHSL(CxImage* h,CxImage* s,CxImage* l);
  548. bool SplitYIQ(CxImage* y,CxImage* i,CxImage* q);
  549. bool SplitXYZ(CxImage* x,CxImage* y,CxImage* z);
  550. bool SplitCMYK(CxImage* c,CxImage* m,CxImage* y,CxImage* k);
  551. static RGBQUAD HSLtoRGB(COLORREF cHSLColor);
  552. static RGBQUAD RGBtoHSL(RGBQUAD lRGBColor);
  553. static RGBQUAD HSLtoRGB(RGBQUAD lHSLColor);
  554. static RGBQUAD YUVtoRGB(RGBQUAD lYUVColor);
  555. static RGBQUAD RGBtoYUV(RGBQUAD lRGBColor);
  556. static RGBQUAD YIQtoRGB(RGBQUAD lYIQColor);
  557. static RGBQUAD RGBtoYIQ(RGBQUAD lRGBColor);
  558. static RGBQUAD XYZtoRGB(RGBQUAD lXYZColor);
  559. static RGBQUAD RGBtoXYZ(RGBQUAD lRGBColor);
  560. #endif //CXIMAGE_SUPPORT_DSP
  561. static RGBQUAD RGBtoRGBQUAD(COLORREF cr);
  562. static COLORREF RGBQUADtoRGB (RGBQUAD c);
  563. //@}
  564. #if CXIMAGE_SUPPORT_SELECTION
  565. /** addtogroup Selection */ //@{
  566. bool SelectionClear(BYTE level = 0);
  567. bool SelectionCreate();
  568. bool SelectionDelete();
  569. bool SelectionInvert();
  570. bool SelectionMirror();
  571. bool SelectionFlip();
  572. bool SelectionAddRect(RECT r, BYTE level = 255);
  573. bool SelectionAddEllipse(RECT r, BYTE level = 255);
  574. bool SelectionAddPolygon(POINT *points, long npoints, BYTE level = 255);
  575. bool SelectionAddColor(RGBQUAD c, BYTE level = 255);
  576. bool SelectionAddPixel(long x, long y, BYTE level = 255);
  577. bool SelectionCopy(CxImage &from);
  578. bool SelectionIsInside(long x, long y);
  579. bool SelectionIsValid();
  580. void SelectionGetBox(RECT& r);
  581. bool SelectionToHRGN(HRGN& region);
  582. bool SelectionSplit(CxImage *dest);
  583. BYTE SelectionGet(const long x,const long y);
  584. bool SelectionSet(CxImage &from);
  585. void SelectionRebuildBox();
  586. BYTE* SelectionGetPointer(const long x = 0,const long y = 0);
  587. //@}
  588. protected:
  589. /** addtogroup Protected */ //@{
  590. bool BlindSelectionIsInside(long x, long y);
  591. BYTE BlindSelectionGet(const long x,const long y);
  592. void SelectionSet(const long x,const long y,const BYTE level);
  593. //@}
  594. public:
  595. #endif //CXIMAGE_SUPPORT_SELECTION
  596. #if CXIMAGE_SUPPORT_ALPHA
  597. /** addtogroup Alpha */ //@{
  598. void AlphaClear();
  599. bool AlphaCreate();
  600. void AlphaDelete();
  601. void AlphaInvert();
  602. bool AlphaMirror();
  603. bool AlphaFlip();
  604. bool AlphaCopy(CxImage &from);
  605. bool AlphaSplit(CxImage *dest);
  606. void AlphaStrip();
  607. void AlphaSet(BYTE level);
  608. bool AlphaSet(CxImage &from);
  609. void AlphaSet(const long x,const long y,const BYTE level);
  610. BYTE AlphaGet(const long x,const long y);
  611. BYTE AlphaGetMax() const;
  612. void AlphaSetMax(BYTE nAlphaMax);
  613. bool AlphaIsValid();
  614. BYTE* AlphaGetPointer(const long x = 0,const long y = 0);
  615. bool AlphaFromTransparency();
  616. void AlphaPaletteClear();
  617. void AlphaPaletteEnable(bool enable=true);
  618. bool AlphaPaletteIsEnabled();
  619. bool AlphaPaletteIsValid();
  620. bool AlphaPaletteSplit(CxImage *dest);
  621. //@}
  622. protected:
  623. /** addtogroup Protected */ //@{
  624. BYTE BlindAlphaGet(const long x,const long y);
  625. //@}
  626. #endif //CXIMAGE_SUPPORT_ALPHA
  627. public:
  628. #if CXIMAGE_SUPPORT_LAYERS
  629. /** addtogroup Layers */ //@{
  630. bool LayerCreate(long position = -1);
  631. bool LayerDelete(long position = -1);
  632. void LayerDeleteAll();
  633. CxImage* GetLayer(long position);
  634. CxImage* GetParent() const;
  635. long GetNumLayers() const;
  636. long LayerDrawAll(HDC hdc, long x=0, long y=0, long cx = -1, long cy = -1, RECT* pClipRect = 0, bool bSmooth = false);
  637. long LayerDrawAll(HDC hdc, const RECT& rect, RECT* pClipRect=NULL, bool bSmooth = false);
  638. //@}
  639. #endif //CXIMAGE_SUPPORT_LAYERS
  640. protected:
  641. /** addtogroup Protected */ //@{
  642. void Startup(DWORD imagetype = 0);
  643. void CopyInfo(const CxImage &src);
  644. void Ghost(const CxImage *src);
  645. void RGBtoBGR(BYTE *buffer, int length);
  646. static float HueToRGB(float n1,float n2, float hue);
  647. void Bitfield2RGB(BYTE *src, DWORD redmask, DWORD greenmask, DWORD bluemask, BYTE bpp);
  648. static int CompareColors(const void *elem1, const void *elem2);
  649. short ntohs(const short word);
  650. long ntohl(const long dword);
  651. void bihtoh(BITMAPINFOHEADER* bih);
  652. void* pDib; //contains the header, the palette, the pixels
  653.     BITMAPINFOHEADER    head; //standard header
  654. CXIMAGEINFO info; //extended information
  655. BYTE* pSelection; //selected region
  656. BYTE* pAlpha; //alpha channel
  657. CxImage** ppLayers; //generic layers
  658. CxImage** ppFrames;
  659. //@}
  660. };
  661. ////////////////////////////////////////////////////////////////////////////
  662. #endif // !defined(__CXIMAGE_H)