mirror of https://github.com/JakubMelka/PDF4QT.git
JPX 2000 image
This commit is contained in:
parent
4fa3c079f2
commit
5896196f56
|
@ -646,17 +646,18 @@ QImage PDFIndexedColorSpace::getImage(const PDFImageData& imageData) const
|
||||||
image.fill(QColor(Qt::white));
|
image.fill(QColor(Qt::white));
|
||||||
|
|
||||||
unsigned int componentCount = imageData.getComponents();
|
unsigned int componentCount = imageData.getComponents();
|
||||||
QDataStream stream(imageData.getData(), QIODevice::ReadOnly);
|
QDataStream stream(const_cast<QByteArray*>(&imageData.getData()), QIODevice::ReadOnly);
|
||||||
PDFBitReader reader(stream, imageData.getBitsPerComponent());
|
PDFBitReader reader(&stream, imageData.getBitsPerComponent());
|
||||||
|
|
||||||
/*
|
|
||||||
if (componentCount != getColorComponentCount())
|
if (componentCount != getColorComponentCount())
|
||||||
{
|
{
|
||||||
throw PDFParserException(PDFTranslationContext::tr("Invalid colors for color space. Color space has %1 colors. Provided color count is %4.").arg(getColorComponentCount()).arg(componentCount));
|
throw PDFParserException(PDFTranslationContext::tr("Invalid colors for indexed color space. Color space has %1 colors. Provided color count is %4.").arg(getColorComponentCount()).arg(componentCount));
|
||||||
}*/
|
}
|
||||||
|
|
||||||
|
Q_ASSERT(componentCount == 1);
|
||||||
|
|
||||||
PDFColor color;
|
PDFColor color;
|
||||||
color.resize(componentCount);
|
color.resize(1);
|
||||||
|
|
||||||
for (unsigned int i = 0, rowCount = imageData.getHeight(); i < rowCount; ++i)
|
for (unsigned int i = 0, rowCount = imageData.getHeight(); i < rowCount; ++i)
|
||||||
{
|
{
|
||||||
|
@ -665,12 +666,8 @@ QImage PDFIndexedColorSpace::getImage(const PDFImageData& imageData) const
|
||||||
|
|
||||||
for (unsigned int j = 0; j < imageData.getWidth(); ++j)
|
for (unsigned int j = 0; j < imageData.getWidth(); ++j)
|
||||||
{
|
{
|
||||||
const unsigned char* currentData = rowData + (j * componentCount);
|
PDFBitReader::Value index = reader.read();
|
||||||
for (unsigned int k = 0; k < componentCount; ++k)
|
color[0] = index;
|
||||||
{
|
|
||||||
constexpr const double COEFFICIENT = 1.0 / 255.0;
|
|
||||||
color[k] = currentData[k] * COEFFICIENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
QColor transformedColor = getColor(color);
|
QColor transformedColor = getColor(color);
|
||||||
QRgb rgb = transformedColor.rgb();
|
QRgb rgb = transformedColor.rgb();
|
||||||
|
|
|
@ -244,6 +244,15 @@ PDFImage PDFImage::createImage(const PDFDocument* document, const PDFStream* str
|
||||||
opj_dparameters_t decompressParameters;
|
opj_dparameters_t decompressParameters;
|
||||||
opj_set_default_decoder_parameters(&decompressParameters);
|
opj_set_default_decoder_parameters(&decompressParameters);
|
||||||
|
|
||||||
|
const bool isIndexed = dynamic_cast<const PDFIndexedColorSpace*>(image.m_colorSpace.data());
|
||||||
|
if (isIndexed)
|
||||||
|
{
|
||||||
|
// What is this flag for? When we have indexed color space, we do not want to resolve index to color
|
||||||
|
// using the color map in the image. Instead of that, we just get indices and resolve them using
|
||||||
|
// our color space.
|
||||||
|
decompressParameters.flags |= OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG;
|
||||||
|
}
|
||||||
|
|
||||||
constexpr CODEC_FORMAT formats[] = { OPJ_CODEC_J2K, OPJ_CODEC_JP2, OPJ_CODEC_JPT, OPJ_CODEC_JPP, OPJ_CODEC_JPX };
|
constexpr CODEC_FORMAT formats[] = { OPJ_CODEC_J2K, OPJ_CODEC_JP2, OPJ_CODEC_JPT, OPJ_CODEC_JPP, OPJ_CODEC_JPX };
|
||||||
for (CODEC_FORMAT format : formats)
|
for (CODEC_FORMAT format : formats)
|
||||||
{
|
{
|
||||||
|
@ -327,7 +336,6 @@ PDFImage PDFImage::createImage(const PDFDocument* document, const PDFStream* str
|
||||||
const OPJ_UINT32 prec = jpegImage->comps[0].prec;
|
const OPJ_UINT32 prec = jpegImage->comps[0].prec;
|
||||||
const OPJ_UINT32 sgnd = jpegImage->comps[0].sgnd;
|
const OPJ_UINT32 sgnd = jpegImage->comps[0].sgnd;
|
||||||
|
|
||||||
const bool isIndexed = dynamic_cast<const PDFIndexedColorSpace*>(image.m_colorSpace.data());
|
|
||||||
int signumCorrection = (sgnd) ? (1 << (prec - 1)) : 0;
|
int signumCorrection = (sgnd) ? (1 << (prec - 1)) : 0;
|
||||||
int shiftLeft = (jpegImage->comps[0].prec < 8) ? 8 - jpegImage->comps[0].prec : 0;
|
int shiftLeft = (jpegImage->comps[0].prec < 8) ? 8 - jpegImage->comps[0].prec : 0;
|
||||||
int shiftRight = (jpegImage->comps[0].prec > 8) ? jpegImage->comps[0].prec - 8 : 0;
|
int shiftRight = (jpegImage->comps[0].prec > 8) ? jpegImage->comps[0].prec - 8 : 0;
|
||||||
|
@ -373,7 +381,7 @@ PDFImage PDFImage::createImage(const PDFDocument* document, const PDFStream* str
|
||||||
int index = stride * row + col * components + componentIndex;
|
int index = stride * row + col * components + componentIndex;
|
||||||
Q_ASSERT(index < imageDataBuffer.size());
|
Q_ASSERT(index < imageDataBuffer.size());
|
||||||
|
|
||||||
imageDataBuffer[index] = transformValue(jpegImage->comps[componentIndex].data[w * row + h]);
|
imageDataBuffer[index] = transformValue(jpegImage->comps[componentIndex].data[w * row + col]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue