#include #include "JpegImageCollection.h" namespace Image { JpegImageCollection::JpegImageCollection(const std::vector& 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::iterator outIterator = m_imageData.begin(); for (std::vector::const_iterator it = images.begin(); it != images.end(); ++it) outIterator = std::copy(it->Data().begin(), it->Data().end(), outIterator); } void JpegImageCollection::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(&m_imageData[cinfo.next_scanline * m_strideY]); jpeg_write_scanlines(&cinfo, scanlines, 1); } jpeg_finish_compress(&cinfo); jpeg_destroy_compress(&cinfo); fclose(outFile); } } // namespace Image