inputImage.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #include "inputImage.h"
  2. const static JOCTET EOI_BUFFER[1] = { JPEG_EOI };
  3. inputImage::inputImage()
  4. {
  5. }
  6. void inputImage::setImageData(const std::string& data)
  7. {
  8. decompressImage(data.c_str(), data.size());
  9. }
  10. unsigned int inputImage::width() const
  11. {
  12. return m_width;
  13. }
  14. unsigned int inputImage::height() const
  15. {
  16. return m_height;
  17. }
  18. unsigned int inputImage::strideX() const
  19. {
  20. return m_strideX;
  21. }
  22. unsigned int inputImage::strideY() const
  23. {
  24. return m_strideY;
  25. }
  26. const std::vector<char>& inputImage::data() const
  27. {
  28. return m_data;
  29. }
  30. void inputImage::init_source(j_decompress_ptr pCinfo)
  31. {
  32. }
  33. boolean inputImage::fill_input_buffer(j_decompress_ptr pCinfo)
  34. {
  35. source_mgr_ptr pSrc = reinterpret_cast<source_mgr_ptr>(pCinfo->src);
  36. pSrc->pub.next_input_byte = EOI_BUFFER;
  37. pSrc->pub.bytes_in_buffer = 1;
  38. return TRUE;
  39. }
  40. void inputImage::skip_input_data(j_decompress_ptr pCinfo, long numBytes)
  41. {
  42. source_mgr_ptr pSrc = reinterpret_cast<source_mgr_ptr>(pCinfo->src);
  43. if (pSrc->pub.bytes_in_buffer < numBytes)
  44. {
  45. pSrc->pub.next_input_byte = EOI_BUFFER;
  46. pSrc->pub.bytes_in_buffer = 1;
  47. }
  48. else
  49. {
  50. pSrc->pub.next_input_byte += numBytes;
  51. pSrc->pub.bytes_in_buffer -= numBytes;
  52. }
  53. }
  54. void inputImage::term_source(j_decompress_ptr pCinfo)
  55. {
  56. }
  57. void inputImage::setSourceMgr(j_decompress_ptr pCinfo, const char* pData, size_t len) const
  58. {
  59. source_mgr_ptr pSrc;
  60. if (pCinfo->src == 0)
  61. pCinfo->src = (struct jpeg_source_mgr *)(*pCinfo->mem->alloc_small)(reinterpret_cast<j_common_ptr>(pCinfo), JPOOL_PERMANENT, sizeof(source_mgr));
  62. pSrc = reinterpret_cast<source_mgr_ptr>(pCinfo->src);
  63. pSrc->pub.init_source = inputImage::init_source;
  64. pSrc->pub.fill_input_buffer = inputImage::fill_input_buffer;
  65. pSrc->pub.skip_input_data = inputImage::skip_input_data;
  66. pSrc->pub.resync_to_restart = jpeg_resync_to_restart;
  67. pSrc->pub.term_source = inputImage::term_source;
  68. pSrc->data = (const JOCTET *)pData;
  69. pSrc->len = len;
  70. pSrc->pub.bytes_in_buffer = len;
  71. pSrc->pub.next_input_byte = pSrc->data;
  72. }
  73. void inputImage::decompressImage(const char* pData, size_t len)
  74. {
  75. struct jpeg_decompress_struct cinfo;
  76. struct jpeg_error_mgr jerr;
  77. jerr.trace_level = 0;
  78. cinfo.err = jpeg_std_error(&jerr);
  79. jpeg_create_decompress(&cinfo);
  80. setSourceMgr(&cinfo, pData, len);
  81. jpeg_read_header(&cinfo, TRUE);
  82. jpeg_start_decompress(&cinfo);
  83. m_width = cinfo.image_width;
  84. m_height = cinfo.image_height;
  85. m_strideX = cinfo.num_components;
  86. m_strideY = m_width * cinfo.num_components;
  87. m_data.resize(m_height * m_strideY);
  88. JSAMPROW scanlines[1];
  89. while (cinfo.output_scanline < cinfo.image_height)
  90. {
  91. scanlines[0] = reinterpret_cast<JSAMPROW>(&m_data[cinfo.output_scanline * m_strideY]);
  92. jpeg_read_scanlines(&cinfo, scanlines, 1);
  93. }
  94. jpeg_finish_decompress(&cinfo);
  95. jpeg_destroy_decompress(&cinfo);
  96. }