Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sharpPDF-图像质量帮助-pdf规范_Pdf_Pdf Generation - Fatal编程技术网

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

sharpPDF-图像质量帮助-pdf规范,pdf,pdf-generation,Pdf,Pdf Generation,我在使用稍微过时的.net库sharpPDF时遇到了一些问题。我们正在从我们的gis web应用程序生成一些图像,需要参考此库中的图像。唯一的问题似乎是库正在使用或未使用的压缩。图像为PNG32 当我将结果与通过iTextSharp创建的pdf进行比较时,结果被严重压缩。不幸的是,这对我们来说是不可能的,不要问我为什么 我注意到,在源代码中,有如下内容: //PDF格式的图像 foreach (pdfImageReference image in _images.Values) {

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

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

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

//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规范的知识,可以帮助我找出可能的问题和压缩在这里


感谢堆…

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

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

如果您想要有损压缩更多压缩+伪影,您应该在彩色/灰色上使用JPEG或JPEG2000,在黑白上使用JBIG2

通过阅读您的评论,您应该这样做:

如果您对JPEG感到满意,那么您希望使用图像的风格。保存包括更多编解码器信息的内容,如下所示:

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 compression,然后手动压缩。这是非常重要的。

我使用了FlateCode,pdf显示:图像数据不足。有什么想法吗?多谢了,听起来你只是在不改变image.content的情况下更改了字典设置。您还必须解码和重新压缩图像数据。如何生成该流对象?数据来自哪里?很可能您需要将压缩机制设置为创建流/图像字典的点。对不起,伙计们,我从来没有在c中处理过图像。。。。这就是库获取内容的方式。。。MemoryStream Outtream=新的MemoryStream;myImage.SaveoutStream,System.Drawing.Imaging.ImageFormat.Jpeg;_content=新字节[outStream.Length];_content=exptream.ToArray;即使我将其更改为.png,它也无法工作。看来你们谈论的重压一定有诀窍。。。谢谢你帮我解决这个问题。