sharpPDF - помогите с качеством изображения - PDF спецификация - PullRequest
0 голосов
/ 19 ноября 2010

У меня проблемы с (немного устаревшей) библиотекой .net, которая называется sharpPDF.Мы генерируем несколько изображений из нашего веб-приложения ГИС и должны ссылаться на изображения в этой библиотеке.Кажется, единственной проблемой является сжатие, которое библиотека использует (или не использует).Изображения PNG32.

Результат довольно сильно сжат, когда я сравниваю результаты с PDF, созданным с помощью iTextSharp (который, к сожалению, нам не подходит, не спрашивайте меня, почему).

Я заметил, что в исходном коде есть что-то вроде следующего:

// Изображения PDF

foreach (pdfImageReference image in _images.Values)
    {
     _trailer.addObject(_bufferLength.ToString());
     _bufferLength += writeToBuffer(_myBuffer, image.getText());
     _bufferLength += writeToBuffer(_myBuffer, "stream" + Convert.ToChar(13) + Convert.ToChar(10));
     _bufferLength += writeToBuffer(_myBuffer, image.content);
     _bufferLength += writeToBuffer(_myBuffer, Convert.ToChar(13).ToString());
     _bufferLength += writeToBuffer(_myBuffer, Convert.ToChar(10).ToString());
     _bufferLength += writeToBuffer(_myBuffer, "endstream" + Convert.ToChar(13) + Convert.ToChar(10));
     _bufferLength += writeToBuffer(_myBuffer, "endobj" + Convert.ToChar(13) + Convert.ToChar(10));
                    currentStep++;
    }

, которые во время выполнения выглядят так:

> 60517 0 obj << /Type /XObject /Subtype
> /Image /Name /I60517 /Filter
> /DCTDecode /Width 830 /Height 1300
> /BitsPerComponent 8 /ColorSpace
> /DeviceRGB /Length 77076
> >> stream
> -here goes some bytes- endstream endobj

Может ли кто-нибудь, кто имеет некоторые знания спецификаций PDF, помочь мне выяснить возможные проблемы со сжатием здесь?

спасибо, куча ...

1 Ответ

0 голосов
/ 19 ноября 2010

То, что вы видите, это поток, который генерируется для определенного изображения, которое сжимается с помощью сжатия JPEG (DCTDecode = Дискретное косинусное преобразование = JPEG). Я удивлен, что у генератора PDF нет опций для выбора кодека для изображения и его настройки (для JPEG вы должны хотя бы иметь возможность установить качество изображения).

Если вы сжимаете цветное / полутоновое изображение, которое хотите сохранить без потерь, вам следует использовать flate. Если вы сжимаете 1-битное изображение, которое хотите сохранить без потерь, вам следует использовать CCITT.

Если вы хотите сжатие с потерями (большее сжатие + артефакты), вы должны использовать JPEG или JPEG2000 для цветного / серого и JBIG2 для черно-белого.

Прочитав ваш комментарий, вы должны сделать следующее:

если вы довольны JPEG, то вы хотите использовать разновидность Image.Save, которая содержит больше информации о кодеках, например:

private static ImageCodecInfo GetEncoderInfo(String mimeType)
{    
    int j;
    ImageCodecInfo[] encoders;
    encoders = ImageCodecInfo.GetImageEncoders();
    for(j = 0; j < encoders.Length; ++j)
    {
        if(encoders[j].MimeType == mimeType)
            return encoders[j];
    }
    return null;
}

Stream GetImageStream(Image image, int compression)
{
    EncoderParameters eps = new EncoderParameters(1);
    eps.Param[0] = new EncoderParameter( Encoder.Quality, (long)compression);
    ImageCodecInfo codecInfo = GetEncoderInfo("image/jpeg");
    if (codecInfo == null) throw new Exception("No jpeg codec - WTF?"); // use better message
    MemoryStream stream = new MemoryStream();
    image.Save(stream, codecInfo, eps);
    stream.Seek(0, SeekOrigin.Begin);
    return stream;
}

Для любого Flate вам придется собирать данные изображения построчно и использовать сжатие Flate ( zlib Ionic хорошо) и сжимать его вручную. Это нетривиально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...