#include "inputImage.h" const static JOCTET EOI_BUFFER[1] = { JPEG_EOI }; inputImage::inputImage() { } void inputImage::setImageData(const std::string& data) { decompressImage(data.c_str(), data.size()); } unsigned int inputImage::width() const { return m_width; } unsigned int inputImage::height() const { return m_height; } unsigned int inputImage::strideX() const { return m_strideX; } unsigned int inputImage::strideY() const { return m_strideY; } const std::vector& inputImage::data() const { return m_data; } void inputImage::init_source(j_decompress_ptr pCinfo) { } boolean inputImage::fill_input_buffer(j_decompress_ptr pCinfo) { source_mgr_ptr pSrc = reinterpret_cast(pCinfo->src); pSrc->pub.next_input_byte = EOI_BUFFER; pSrc->pub.bytes_in_buffer = 1; return TRUE; } void inputImage::skip_input_data(j_decompress_ptr pCinfo, long numBytes) { source_mgr_ptr pSrc = reinterpret_cast(pCinfo->src); if (pSrc->pub.bytes_in_buffer < numBytes) { pSrc->pub.next_input_byte = EOI_BUFFER; pSrc->pub.bytes_in_buffer = 1; } else { pSrc->pub.next_input_byte += numBytes; pSrc->pub.bytes_in_buffer -= numBytes; } } void inputImage::term_source(j_decompress_ptr pCinfo) { } void inputImage::setSourceMgr(j_decompress_ptr pCinfo, const char* pData, size_t len) const { source_mgr_ptr pSrc; if (pCinfo->src == 0) pCinfo->src = (struct jpeg_source_mgr *)(*pCinfo->mem->alloc_small)(reinterpret_cast(pCinfo), JPOOL_PERMANENT, sizeof(source_mgr)); pSrc = reinterpret_cast(pCinfo->src); pSrc->pub.init_source = inputImage::init_source; pSrc->pub.fill_input_buffer = inputImage::fill_input_buffer; pSrc->pub.skip_input_data = inputImage::skip_input_data; pSrc->pub.resync_to_restart = jpeg_resync_to_restart; pSrc->pub.term_source = inputImage::term_source; pSrc->data = (const JOCTET *)pData; pSrc->len = len; pSrc->pub.bytes_in_buffer = len; pSrc->pub.next_input_byte = pSrc->data; } void inputImage::decompressImage(const char* pData, size_t len) { struct jpeg_decompress_struct cinfo; struct jpeg_error_mgr jerr; jerr.trace_level = 0; cinfo.err = jpeg_std_error(&jerr); jpeg_create_decompress(&cinfo); setSourceMgr(&cinfo, pData, len); jpeg_read_header(&cinfo, TRUE); jpeg_start_decompress(&cinfo); m_width = cinfo.image_width; m_height = cinfo.image_height; m_strideX = cinfo.num_components; m_strideY = m_width * cinfo.num_components; m_data.resize(m_height * m_strideY); JSAMPROW scanlines[1]; while (cinfo.output_scanline < cinfo.image_height) { scanlines[0] = reinterpret_cast(&m_data[cinfo.output_scanline * m_strideY]); jpeg_read_scanlines(&cinfo, scanlines, 1); } jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); }