ObjMultiFrame.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. /*
  2. * Copyright (C) =USTC= Fu Li
  3. *
  4. * Author : Fu Li
  5. * Create : 2004-8-31
  6. * Home : http://www.crazy-bit.com/
  7. * Mail : crazybit@263.net
  8. * History :
  9. */
  10. #ifndef __FOO_OBJECT_MULTI_IMAGE__2004_08_31__H__
  11. #define __FOO_OBJECT_MULTI_IMAGE__2004_08_31__H__
  12. #include "ObjImage.h"
  13. //=============================================================================
  14. /**
  15. * Image container.
  16. */
  17. class FCObjMultiFrame : public FCObject
  18. {
  19. PCL_Interface_Composite<FCObjImage> m_ImgList ;
  20. public:
  21. /// Add frame to object.
  22. /// after the pImg be added, you can't delete it later.
  23. void AddFrame (FCObjImage* pImg)
  24. {
  25. m_ImgList.PCL_PushObject(pImg) ;
  26. }
  27. /// Get image count.
  28. int GetFrameCount() const {return m_ImgList.PCL_GetObjectCount();}
  29. /// Get zero-based index image.
  30. FCObjImage* GetFrame (int nFrame) const {return m_ImgList.PCL_GetObject(nFrame);}
  31. /// Delete all frame.
  32. void DeleteAllFrame() {m_ImgList.PCL_DeleteAllObjects();}
  33. /**
  34. * @name Read/Write image file.
  35. */
  36. //@{
  37. /**
  38. * Load image file.
  39. * this function determine image format by file's ext name.
  40. * @param pProperty : optional, you can pass NULL if you don't care.
  41. */
  42. bool Load (const char* szFileName, FCImageProperty* pProperty = 0)
  43. {
  44. IMAGE_TYPE imgType = FCObjImage::GetImageHandleFactory()->QueryImageFileType(szFileName) ;
  45. std::auto_ptr<FCImageHandleBase> pHandler (FCObjImage::GetImageHandleFactory()->CreateImageHandle(imgType)) ;
  46. if (!pHandler.get())
  47. return false ;
  48. PCL_Interface_Composite<FCObjImage> listImage ;
  49. std::auto_ptr<FCImageProperty> pImgProp ;
  50. bool bRet = pHandler->LoadImageFile (szFileName, listImage, pImgProp) ;
  51. if (bRet)
  52. {
  53. // get frames
  54. std::deque<FCObjImage*> ls ;
  55. listImage.PCL_ThrowOwnership (ls) ;
  56. for (size_t i=0 ; i < ls.size() ; i++)
  57. AddFrame (ls[i]) ;
  58. // get property
  59. if (pImgProp.get() && pProperty)
  60. *pProperty = *pImgProp ;
  61. }
  62. assert (bRet) ;
  63. return bRet ;
  64. }
  65. /**
  66. * Load image from memory.
  67. * @param pProperty : optional, you can pass NULL if you don't care.
  68. */
  69. bool Load (BYTE* pStart, int nMemSize, IMAGE_TYPE imgType, FCImageProperty* pProperty = 0)
  70. {
  71. std::auto_ptr<FCImageHandleBase> pHandler (FCObjImage::GetImageHandleFactory()->CreateImageHandle(imgType)) ;
  72. if (!pHandler.get())
  73. return false ;
  74. PCL_Interface_Composite<FCObjImage> listImage ;
  75. std::auto_ptr<FCImageProperty> pImgProp ;
  76. bool bRet = pHandler->LoadImageMemory (pStart, nMemSize, listImage, pImgProp) ;
  77. if (bRet)
  78. {
  79. // get frames
  80. std::deque<FCObjImage*> ls ;
  81. listImage.PCL_ThrowOwnership (ls) ;
  82. for (size_t i=0 ; i < ls.size() ; i++)
  83. AddFrame (ls[i]) ;
  84. // get property
  85. if (pImgProp.get() && pProperty)
  86. *pProperty = *pImgProp ;
  87. }
  88. assert (bRet) ;
  89. return bRet ;
  90. }
  91. /**
  92. * Save image to file.
  93. * this function determine image format by file's ext name.
  94. */
  95. bool Save (const char* szFileName, const FCImageProperty& rProp) const
  96. {
  97. if (!GetFrameCount() || !szFileName)
  98. return false ;
  99. IMAGE_TYPE imgType = FCObjImage::GetImageHandleFactory()->QueryImageFileType(szFileName) ;
  100. std::auto_ptr<FCImageHandleBase> pHandler (FCObjImage::GetImageHandleFactory()->CreateImageHandle(imgType)) ;
  101. if (!pHandler.get())
  102. return false ;
  103. // save list
  104. std::deque<const FCObjImage*> saveList ;
  105. for (int i=0 ; i < GetFrameCount() ; i++)
  106. saveList.push_back (GetFrame(i)) ;
  107. return pHandler->SaveImageFile (szFileName, saveList, rProp) ;
  108. }
  109. //@}
  110. };
  111. //=============================================================================
  112. // inline Implement
  113. //=============================================================================
  114. #endif