我在使用名为sharpPDF的(稍微过时的) .net库时遇到了一些问题。我们正在从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规范的知识,可以帮助我找出可能的问题与压缩在这里?
谢谢你..。
发布于 2010-11-19 23:52:34
您看到的是为特定图像生成的流,该图像正在使用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压缩(Ionic's zlib很好)并手动压缩它。这不是无关紧要的。
https://stackoverflow.com/questions/4224629
复制相似问题