ImageHandle_FreeImage.h 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. /*
  2. * Copyright (C) =USTC= Fu Li
  3. *
  4. * Author : Fu Li
  5. * Create : 2004-4-9
  6. * Home : http://www.crazy-bit.com/
  7. * Mail : crazybit@263.net
  8. * History :
  9. */
  10. #ifndef __FOO_IMAGE_HANDLE_FREEIMAGE__2004_04_09__H__
  11. #define __FOO_IMAGE_HANDLE_FREEIMAGE__2004_04_09__H__
  12. #include "../FreeImage_Helper.h"
  13. //class FCImageHandle ;
  14. class FCImageHandle_FreeImage ;
  15. //=============================================================================
  16. /**
  17. * Read/Write image via FreeImage library.
  18. * It's a free image library, you can download from <a href='http://sourceforge.net/projects/freeimage' target='_blank'>http://sourceforge.net/projects/freeimage</a><BR><BR>
  19. * Load from file can load all frames of gif/tiff, load from memory only load first frame.
  20. */
  21. class FCImageHandle_FreeImage : public FCImageHandleBase
  22. {
  23. static void StoreFrame (FIBITMAP* pFIimage,
  24. PCL_Interface_Composite<FCObjImage>& rImageList,
  25. std::auto_ptr<FCImageProperty>& rImageProp)
  26. {
  27. // create frame
  28. FCObjImage * pImg = new FCObjImage ;
  29. __pcl_FreeImage_to_PCLImage (pFIimage, *pImg) ;
  30. if (pImg->IsValidImage())
  31. {
  32. rImageList.PCL_PushObject (pImg) ;
  33. }
  34. else
  35. {
  36. delete pImg ;
  37. }
  38. }
  39. /// Read file routine
  40. virtual bool LoadImageFile (const char* szFileName,
  41. PCL_Interface_Composite<FCObjImage>& rImageList,
  42. std::auto_ptr<FCImageProperty>& rImageProp)
  43. {
  44. // get image format
  45. FREE_IMAGE_FORMAT imgType = FreeImage_GetFileType (szFileName) ;
  46. if (imgType == FIF_UNKNOWN)
  47. return false ;
  48. // read image file via FreeImage library
  49. if ((imgType == FIF_GIF) || (imgType == FIF_TIFF))
  50. {
  51. FIMULTIBITMAP * FIMul = FreeImage_OpenMultiBitmap (imgType, szFileName, FALSE, TRUE) ;
  52. if (FIMul)
  53. {
  54. rImageProp = std::auto_ptr<FCImageProperty>(new FCImageProperty) ;
  55. // get all frames
  56. for (int i=0 ; i < FreeImage_GetPageCount(FIMul) ; i++)
  57. {
  58. FIBITMAP * pFI = FreeImage_LockPage (FIMul, i) ;
  59. if (pFI)
  60. {
  61. StoreFrame (pFI, rImageList, rImageProp) ;
  62. // get frame delay time
  63. FITAG * tag ;
  64. if (FreeImage_GetMetadata (FIMD_ANIMATION, pFI, "FrameTime", &tag))
  65. {
  66. rImageProp->PutFrameDelay (*(int*)FreeImage_GetTagValue(tag)) ;
  67. }
  68. FreeImage_UnlockPage (FIMul, pFI, FALSE) ;
  69. }
  70. }
  71. FreeImage_CloseMultiBitmap (FIMul) ;
  72. }
  73. }
  74. else
  75. {
  76. FIBITMAP * pFI = FreeImage_Load (imgType, szFileName) ;
  77. if (pFI)
  78. {
  79. StoreFrame (pFI, rImageList, rImageProp) ;
  80. FreeImage_Unload (pFI) ;
  81. }
  82. }
  83. return rImageList.PCL_GetObjectCount() ? true : false ;
  84. }
  85. /// Read memory routine
  86. virtual bool LoadImageMemory (const BYTE* pStart, int nMemSize,
  87. PCL_Interface_Composite<FCObjImage>& rImageList,
  88. std::auto_ptr<FCImageProperty>& rImageProp)
  89. {
  90. FIMEMORY * pMem = FreeImage_OpenMemory (const_cast<BYTE*>(pStart), nMemSize) ;
  91. if (!pMem)
  92. return false ;
  93. // get image format
  94. FREE_IMAGE_FORMAT imgType = FreeImage_GetFileTypeFromMemory (pMem) ;
  95. FIBITMAP * pFI = FreeImage_LoadFromMemory (imgType, pMem) ;
  96. if (pFI)
  97. {
  98. StoreFrame (pFI, rImageList, rImageProp) ;
  99. FreeImage_Unload (pFI) ;
  100. }
  101. FreeImage_CloseMemory (pMem) ;
  102. return rImageList.PCL_GetObjectCount() ? true : false ;
  103. }
  104. /// save to file routine
  105. virtual bool SaveImageFile (const char* szFileName,
  106. const std::deque<const FCObjImage*>& rImageList,
  107. const FCImageProperty& rImageProp)
  108. {
  109. if (rImageList.empty() || !rImageList[0]->IsValidImage())
  110. return false ;
  111. const FCObjImage &img = *rImageList[0] ;
  112. // is the FreeImage library support
  113. FREE_IMAGE_FORMAT imgFormat = FreeImage_GetFIFFromFilename (szFileName) ;
  114. if (imgFormat == FIF_UNKNOWN)
  115. return false ;
  116. if (!FreeImage_FIFSupportsWriting (imgFormat) || !FreeImage_FIFSupportsExportBPP (imgFormat, img.ColorBits()))
  117. return false ;
  118. // create FreeImage object
  119. FIBITMAP * pFI = __pcl_AllocateFreeImage (img) ;
  120. if (!pFI)
  121. return false ;
  122. // save flag
  123. int nFlag = 0 ;
  124. if ((imgFormat == FIF_GIF) && (img.ColorBits() <= 8))
  125. {
  126. // gif transparency
  127. int nCount = 1 << img.ColorBits(),
  128. nIndex = GifSaveTransparentIndex(rImageProp) ;
  129. if (nIndex != -1)
  130. {
  131. PCL_array<BYTE> aTab(nCount) ;
  132. memset (aTab.get(), 0xFF, nCount) ;
  133. aTab[FClamp(nIndex,0,nCount-1)] = 0 ;
  134. FreeImage_SetTransparent (pFI, true) ;
  135. FreeImage_SetTransparencyTable (pFI, aTab.get(), nCount) ;
  136. }
  137. }
  138. else if (imgFormat == FIF_JPEG)
  139. {
  140. nFlag = JpegSaveQuality(rImageProp) ;
  141. }
  142. // save image file
  143. bool bRet = FreeImage_Save (imgFormat, pFI, szFileName, nFlag) ? true : false ;
  144. FreeImage_Unload (pFI) ;
  145. return bRet ;
  146. }
  147. virtual ~FCImageHandle_FreeImage() {FreeImage_DeInitialise();}
  148. public:
  149. FCImageHandle_FreeImage() {FreeImage_Initialise();}
  150. };
  151. //=============================================================================
  152. // inline Implement
  153. //=============================================================================
  154. #endif