68 lines
1.6 KiB
C++
68 lines
1.6 KiB
C++
#include <stdio.h>
|
|
#include "JpegImageCollection.h"
|
|
|
|
|
|
namespace Image {
|
|
|
|
JpegImageCollection::JpegImageCollection(const std::vector<JpegImage>& 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<JpegImage>::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<JSAMPROW>(&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
|