int PDFWriter::saveJpegImage(const QString &jpegFileName, const QSize &sizePixels, Types::ColorTypes colorType) { int err = 0; err = addImageResourcesAndXObject(); QFile jpegFile(jpegFileName); if (!jpegFile.open(QIODevice::ReadOnly)) return 2; const int jpegFileSize = jpegFile.size(); if (jpegFileSize == 0) return 3; const QString colorSpace = colorType == Types::ColorTypeCMYK ? QLatin1String("/DeviceCMYK") : colorType == Types::ColorTypeRGB ? QLatin1String("/DeviceRGB") : QLatin1String("/DeviceGray"); // Yes. Cmyk jpegs in PDFs need reverse decoding, somehow const QString decodeArray = colorType == Types::ColorTypeCMYK ? QLatin1String("/Decode [1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0]" LINEFEED) : QString(); addOffsetToXref(); m_outStream << QString::fromLatin1( LINEFEED "%1 0 obj" LINEFEED "<</ColorSpace %2" LINEFEED "/Subtype /Image" LINEFEED "/Length %3" LINEFEED "/Width %4" LINEFEED "/Type /XObject" LINEFEED "/Height %5" LINEFEED "/BitsPerComponent 8" LINEFEED "/Filter /DCTDecode" LINEFEED "%6" ">>" LINEFEED "stream" LINEFEED) .arg(m_pdfObjectCount) .arg(colorSpace) .arg(jpegFileSize) .arg(sizePixels.width()) .arg(sizePixels.height()) .arg(decodeArray); m_outStream.flush(); while (!jpegFile.atEnd()) m_outStream.device()->write(jpegFile.read(200000)); m_outStream << LINEFEED "endstream" LINEFEED "endobj"; return err; }
void JPEGFileWriter::handleJPEG(const char *theJPEG, size_t theSize) { ++myCount; std::ostringstream fileName; fileName << myDirectory << "/" << myFileBase << std::setw(9) << std::setfill('0') << myCount << ".jpg"; std::ofstream jpegFile(fileName.str(), std::ios::binary); auto thisErrno = errno; if (! jpegFile.is_open()) { throw std::logic_error("Failed to open " + fileName.str() + ": " + std::strerror(thisErrno)); } jpegFile.write(theJPEG, theSize); jpegFile.close(); }