| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- #include <stdio.h>
- #include "outputImage.h"
- outputImage::outputImage(const std::vector<inputImage>& images) :
- m_width(0),
- m_height(0),
- m_strideX(0),
- m_strideY(0)
- {
- if (images.size() == 0)
- return;
- m_width = images[0].width();
- m_strideX = images[0].strideX();
- m_strideY = images[0].strideY();
- size_t height = images[0].height();
- m_height = height * images.size();
- m_imageData.resize(m_strideY * m_height);
- std::vector<char>::iterator outIterator = m_imageData.begin();
- for (std::vector<inputImage>::const_iterator it = images.begin(); it != images.end(); ++it)
- outIterator = std::copy(it->data().begin(), it->data().end(), outIterator);
- }
- void outputImage::save(const std::string& fileName)
- {
- if (m_width == 0 || m_height == 0 || m_strideX == 0 || m_strideY == 0)
- return;
- struct jpeg_compress_struct cinfo;
- struct jpeg_error_mgr jerr;
- FILE* outFile = fopen(fileName.c_str(), "wb");
- cinfo.err = jpeg_std_error(&jerr);
- jpeg_create_compress(&cinfo);
- jpeg_stdio_dest(&cinfo, outFile);
- cinfo.image_width = m_width;
- cinfo.image_height = m_height;
- cinfo.input_components = m_strideX;
- cinfo.in_color_space = JCS_RGB;
- jpeg_set_defaults( &cinfo );
- cinfo.num_components = 3;
- cinfo.dct_method = JDCT_FLOAT;
- jpeg_set_quality(&cinfo, 80, TRUE);
- jpeg_start_compress( &cinfo, TRUE );
- JSAMPROW scanlines[1];
- while (cinfo.next_scanline < cinfo.image_height)
- {
- scanlines[0] = reinterpret_cast<JSAMPROW>(&m_imageData[cinfo.next_scanline * m_strideY]);
- jpeg_write_scanlines(&cinfo, scanlines, 1);
- }
- jpeg_finish_compress(&cinfo);
- jpeg_destroy_compress(&cinfo);
- fclose(outFile);
- }
|