ImageHandle_IJL15.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. /*
  2. * Copyright (C) =USTC= Fu Li
  3. *
  4. * Author : Fu Li
  5. * Create : 2006-2-21
  6. * Home : http://www.crazy-bit.com/
  7. * Mail : crazybit@263.net
  8. * History :
  9. */
  10. #ifndef __FOO_IMAGE_HANDLE_IJL15__2006_02_21__H__
  11. #define __FOO_IMAGE_HANDLE_IJL15__2006_02_21__H__
  12. #include "../ObjImage.h"
  13. #include "../../lib/ijl15/ijl.h"
  14. //class FCImageHandle ;
  15. class FCImageHandle_IJL15 ;
  16. //=============================================================================
  17. /**
  18. * Read/Write Jpeg file via intel jpeg library.
  19. */
  20. class FCImageHandle_IJL15 : public FCImageHandleBase
  21. {
  22. // auto init and free helper class.
  23. struct FCAutoIJL_Image : public JPEG_CORE_PROPERTIES
  24. {
  25. FCAutoIJL_Image() { ijlInit(this); }
  26. ~FCAutoIJL_Image() { ijlFree(this); }
  27. };
  28. /// Read JPEG image via IJL1.5.
  29. virtual bool LoadImageMemory (const BYTE* pStart, int nMemSize,
  30. PCL_Interface_Composite<FCObjImage>& rImageList,
  31. std::auto_ptr<FCImageProperty>& rImageProp)
  32. {
  33. if (!pStart)
  34. return false ;
  35. std::auto_ptr<FCAutoIJL_Image> pIJL (new FCAutoIJL_Image) ;
  36. // read image info
  37. pIJL->JPGBytes = (unsigned char*)pStart ;
  38. pIJL->JPGSizeBytes = nMemSize ;
  39. if (ijlRead (pIJL.get(), IJL_JBUFF_READPARAMS) != IJL_OK)
  40. return false ;
  41. // dest image
  42. pIJL->DIBChannels = 3 ;
  43. pIJL->DIBColor = IJL_BGR ;
  44. switch (pIJL->JPGChannels)
  45. {
  46. case 1 : pIJL->JPGColor = IJL_G ; break ;
  47. case 3 : pIJL->JPGColor = IJL_YCBCR ; break ;
  48. case 4 : pIJL->JPGColor = IJL_YCBCRA_FPX ;
  49. pIJL->DIBChannels = 4 ;
  50. pIJL->DIBColor = IJL_RGBA_FPX ;
  51. break ;
  52. }
  53. // create image object
  54. FCObjImage * pImg = new FCObjImage ;
  55. if (!pImg->Create (pIJL->JPGWidth, pIJL->JPGHeight, pIJL->DIBChannels * 8))
  56. {
  57. delete pImg ;
  58. return false ;
  59. }
  60. pIJL->DIBWidth = pIJL->JPGWidth ;
  61. pIJL->DIBHeight = -pIJL->JPGHeight ; // DIB Format
  62. pIJL->DIBBytes = pImg->GetMemStart() ;
  63. pIJL->DIBPadBytes = pImg->GetPitch() - pImg->Width() * pImg->ColorBits()/8 ;
  64. // read whole image
  65. if (ijlRead (pIJL.get(), IJL_JBUFF_READWHOLEIMAGE) != IJL_OK)
  66. {
  67. delete pImg ;
  68. return false ;
  69. }
  70. // 4-Channel need BGRA_to_RGBA
  71. if (pIJL->DIBChannels == 4)
  72. {
  73. for (int y=0 ; y < pImg->Height() ; y++)
  74. for (int x=0 ; x < pImg->Width() ; x++)
  75. {
  76. BYTE * p = pImg->GetBits(x,y) ;
  77. FSwap (p[0], p[2]) ;
  78. }
  79. }
  80. // add to list
  81. rImageList.PCL_PushObject (pImg) ;
  82. return true ;
  83. }
  84. /// Write JPEG image via IJL1.5.
  85. virtual bool SaveImageFile (const char* szFileName,
  86. const std::deque<const FCObjImage*>& rImageList,
  87. const FCImageProperty& rImageProp)
  88. {
  89. if (rImageList.empty() || !rImageList[0]->IsValidImage())
  90. return false ;
  91. const FCObjImage &img = *rImageList[0] ;
  92. // must 24bpp image's format
  93. if (img.ColorBits() != 24)
  94. {assert(false); return false;}
  95. std::auto_ptr<FCAutoIJL_Image> pIJL (new FCAutoIJL_Image) ;
  96. pIJL->DIBWidth = img.Width() ;
  97. pIJL->DIBHeight = -img.Height() ; // DIB Format
  98. pIJL->DIBChannels = 3 ;
  99. pIJL->DIBPadBytes = img.GetPitch() - img.Width() * 3 ;
  100. pIJL->DIBColor = IJL_BGR ;
  101. pIJL->JPGFile = const_cast<PTSTR>(szFileName) ;
  102. pIJL->JPGWidth = img.Width() ;
  103. pIJL->JPGHeight = img.Height() ;
  104. pIJL->jquality = JpegSaveQuality(rImageProp) ;
  105. pIJL->JPGChannels = 3 ;
  106. pIJL->JPGColor = IJL_YCBCR ;
  107. pIJL->JPGSubsampling = IJL_411 ;
  108. pIJL->DIBBytes = img.GetMemStart() ;
  109. return (ijlWrite (pIJL.get(), IJL_JFILE_WRITEWHOLEIMAGE) == IJL_OK) ;
  110. }
  111. };
  112. #endif