首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sharpPDF -图像质量帮助- pdf规范

sharpPDF -图像质量帮助- pdf规范
EN

Stack Overflow用户
提问于 2010-11-19 19:44:13
回答 1查看 1.2K关注 0票数 0

我在使用名为sharpPDF的(稍微过时的) .net库时遇到了一些问题。我们正在从gis web应用程序中生成一些图像,并需要引用此库中的图像。唯一的问题似乎是库正在使用(或不使用)的压缩。图像是PNG32格式的。

当我将结果与通过iTextSharp创建的pdf进行比较时,结果是相当严重的压缩(不幸的是,这对我们来说是行不通的,不要问我为什么)。

我注意到,在源代码中,有如下内容:

//PDF的图像

代码语言:javascript
复制
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++;
    }

在运行时中,它看起来像这样

代码语言:javascript
复制
> 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规范的知识,可以帮助我找出可能的问题与压缩在这里?

谢谢你..。

EN

回答 1

Stack Overflow用户

发布于 2010-11-19 23:52:34

您看到的是为特定图像生成的流,该图像正在使用JPEG压缩(DCTDecode =离散余弦变换= JPEG)。令我惊讶的是,PDF生成器没有为图像选择编解码器并进行配置的选项(对于JPEG,您至少应该能够设置图像质量)。

如果您正在压缩您希望无损的彩色/灰度图像,则应使用flate。如果您要无损压缩1位图像,则应使用CCITT。

如果你想要有损压缩(更多的压缩+伪像),你应该在彩色/灰色上使用JPEG或JPEG2000,在黑白上使用JBIG2。

通过阅读你的评论,这是你应该做的:

如果您对JPEG感到满意,那么您需要使用包含更多编解码器信息的Image.Save风格,如下所示:

代码语言:javascript
复制
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压缩(Ionic's zlib很好)并手动压缩它。这不是无关紧要的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4224629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档