JpegImageCollection.cpp 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #include <stdio.h>
  2. #include "JpegImageCollection.h"
  3. namespace Image {
  4. JpegImageCollection::JpegImageCollection(const std::vector<JpegImage>& images) :
  5. m_width(0),
  6. m_height(0),
  7. m_strideX(0),
  8. m_strideY(0)
  9. {
  10. if (images.size() == 0)
  11. return;
  12. m_width = images[0].Width();
  13. m_strideX = images[0].StrideX();
  14. m_strideY = images[0].StrideY();
  15. size_t height = images[0].Height();
  16. m_height = height * images.size();
  17. m_imageData.resize(m_strideY * m_height);
  18. std::vector<char>::iterator outIterator = m_imageData.begin();
  19. for (std::vector<JpegImage>::const_iterator it = images.begin(); it != images.end(); ++it)
  20. outIterator = std::copy(it->Data().begin(), it->Data().end(), outIterator);
  21. }
  22. void JpegImageCollection::Save(const std::string& fileName)
  23. {
  24. if (m_width == 0 || m_height == 0 || m_strideX == 0 || m_strideY == 0)
  25. return;
  26. struct jpeg_compress_struct cinfo;
  27. struct jpeg_error_mgr jerr;
  28. FILE* outFile = fopen(fileName.c_str(), "wb");
  29. cinfo.err = jpeg_std_error(&jerr);
  30. jpeg_create_compress(&cinfo);
  31. jpeg_stdio_dest(&cinfo, outFile);
  32. cinfo.image_width = m_width;
  33. cinfo.image_height = m_height;
  34. cinfo.input_components = m_strideX;
  35. cinfo.in_color_space = JCS_RGB;
  36. jpeg_set_defaults( &cinfo );
  37. cinfo.num_components = 3;
  38. cinfo.dct_method = JDCT_FLOAT;
  39. jpeg_set_quality(&cinfo, 80, TRUE);
  40. jpeg_start_compress( &cinfo, TRUE );
  41. JSAMPROW scanlines[1];
  42. while (cinfo.next_scanline < cinfo.image_height)
  43. {
  44. scanlines[0] = reinterpret_cast<JSAMPROW>(&m_imageData[cinfo.next_scanline * m_strideY]);
  45. jpeg_write_scanlines(&cinfo, scanlines, 1);
  46. }
  47. jpeg_finish_compress(&cinfo);
  48. jpeg_destroy_compress(&cinfo);
  49. fclose(outFile);
  50. }
  51. } // namespace Image