outputImage.cpp 1.6 KB

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