Image 动态图像质量损失

Image 动态图像质量损失,image,pdf-generation,dynamicpdf,Image,Pdf Generation,Dynamicpdf,我们正在使用一个名为的产品从数据库的动态数据动态生成PDF。他们的文档说,他们的软件保持图像字节不变,不做任何更改。尽管如此,我们已经观察到,我们添加的图像在生成的PDF输出上似乎有质量损失(至少它们看起来是这样的)。所以我的问题是,我需要如何使用DynamicPDF API来确保图像质量输出与我输入的相同或接近 我们使用的是版本5.1.2 Build 13650,下面是用于添加图像的代码 private void plcImageMain_LaidOut(object sender, Plac

我们正在使用一个名为的产品从数据库的动态数据动态生成PDF。他们的文档说,他们的软件保持图像字节不变,不做任何更改。尽管如此,我们已经观察到,我们添加的图像在生成的PDF输出上似乎有质量损失(至少它们看起来是这样的)。所以我的问题是,我需要如何使用DynamicPDF API来确保图像质量输出与我输入的相同或接近

我们使用的是版本5.1.2 Build 13650,下面是用于添加图像的代码

private void plcImageMain_LaidOut(object sender, PlaceHolderLaidOutEventArgs e)
{
 if (e.LayoutWriter.RecordSets.Current.HasData)
 {
         string productId = e.LayoutWriter.RecordSets.Current["ProductId"].ToString();
         string imgUrl = base.SetImageUrlParams(e.LayoutWriter.RecordSets.Current["ImageUrl"] as string, e.ContentArea.Width, e.ContentArea.Height);

         System.Drawing.Bitmap bm = base.GetBitmap(imgUrl);

         ceTe.DynamicPDF.PageElements.Image img = new ceTe.DynamicPDF.PageElements.Image(bm, 0, 0);
         img.Height = e.ContentArea.Height;
         img.Width = e.ContentArea.Width;
         e.ContentArea.Add(img);
 }
}

/// <summary>
/// Gets a bitmap from the requested image url
/// </summary>
/// <param name="imgCtrl"></param>
/// <param name="imgUrl"></param>
protected System.Drawing.Bitmap GetBitmap(string imgUrl)
{
 // TODO: Add some validation to ensure the url is an image.
 System.Net.WebRequest httpRequest = System.Net.HttpWebRequest.Create(imgUrl);

 using (System.Net.HttpWebResponse httpResponse = httpRequest.GetResponse() as System.Net.HttpWebResponse)
 using (Stream imgStream = httpResponse.GetResponseStream())
 {
    System.Drawing.Bitmap bm = System.Drawing.Bitmap.FromStream(imgStream) as System.Drawing.Bitmap;
    return bm;
 }
}

好吧,这看起来在调整大小方面做得不好,但它也可以是您的Acrobat阅读器在屏幕上进行调整,实际数据非常好

您应该能够通过在Reader中单击图像来选择图像(因此它突出显示为蓝色),然后将其复制并粘贴到您选择的图像编辑程序中。这样,您就应该在原始解决方案中获得资源,不管它被缩小到什么程度


还有一些工具可以从PDF中提取图像和其他资源,但我不知道可以立即推荐哪种

好吧,这看起来在调整大小方面做得不好,但它也可能是您的Acrobat阅读器在屏幕上做的,实际数据非常好

您应该能够通过在Reader中单击图像来选择图像(因此它突出显示为蓝色),然后将其复制并粘贴到您选择的图像编辑程序中。这样,您就应该在原始解决方案中获得资源,不管它被缩小到什么程度


还有一些工具可以从PDF中提取图像和其他资源,但我不知道可以立即推荐哪种

对于DynamicPDF产品,在图像添加到PDF文档时,不会对其进行任何大小调整或重新采样。佩卡实际上是对的。读取器以不同的清晰度(在不同的缩放级别)直观地表示图像

如果您能够从PDF中提取图像(如Pekka建议的那样),您将看到图像数据完全是原始的,没有修改

为了演示这一点,您可以做的另一件事是拍摄原始图像,右键单击它并选择“转换为Adobe PDF”(需要完整的Acrobat Pro)。在新创建的PDF中,您还可以直观地看到相同的结果

最后一件值得注意的事情是,上面显示的代码中有一点效率低下。现在,您正在将图像内容作为流提取,从该流对象创建位图,然后使用该位图创建DynamicPDF图像对象。实现这一点的推荐方法是从URL获取图像的流对象,将其传递到DynamicPDF的ImageData静态方法“GetImage”。此GetImage方法将返回ImageData对象。然后使用该图像数据从中创建DynamicPDF图像对象


以这种方式加载图像有两个明显的优点。首先,你没有需要单独处理图像内容的System.Drawing.Bitmap对象所涉及的开销(因此理论上没有这个应用程序运行得更快)。第二个优点是,图像内容以原始的本地压缩方式添加到PDF中。与JPEG图像的情况一样,使用图像的本机压缩而不是位图压缩将导致较小的输出PDF文件大小。所有这些都不会对输出PDF的图像质量产生任何影响,但会影响效率和输出PDF文件大小。

对于DynamicPDF产品,在将图像添加到PDF文档时,不会对图像进行任何大小调整或重采样。佩卡实际上是对的。读取器以不同的清晰度(在不同的缩放级别)直观地表示图像

如果您能够从PDF中提取图像(如Pekka建议的那样),您将看到图像数据完全是原始的,没有修改

为了演示这一点,您可以做的另一件事是拍摄原始图像,右键单击它并选择“转换为Adobe PDF”(需要完整的Acrobat Pro)。在新创建的PDF中,您还可以直观地看到相同的结果

最后一件值得注意的事情是,上面显示的代码中有一点效率低下。现在,您正在将图像内容作为流提取,从该流对象创建位图,然后使用该位图创建DynamicPDF图像对象。实现这一点的推荐方法是从URL获取图像的流对象,将其传递到DynamicPDF的ImageData静态方法“GetImage”。此GetImage方法将返回ImageData对象。然后使用该图像数据从中创建DynamicPDF图像对象


以这种方式加载图像有两个明显的优点。首先,你没有需要单独处理图像内容的System.Drawing.Bitmap对象所涉及的开销(因此理论上没有这个应用程序运行得更快)。第二个优点是,图像内容以原始的本地压缩方式添加到PDF中。与JPEG图像的情况一样,使用图像的本机压缩而不是位图压缩将导致较小的输出PDF文件大小。所有这些都不会对输出PDF的图像质量产生任何影响,但可能会影响效率和输出PDF文件大小。

你们都对,是Acrobat导致了模糊显示。“首选项”中有一个名为“分辨率”的设置,而不是默认使用系统dpi设置。Acrobat决定使用自定义dpi设置110(我不知道为什么!?)。将其设置为system(在我的例子中是96dpi)后,图像是水晶c
protected ceTe.DynamicPDF.Imaging.ImageData GetImageData(string imgUrl)
{
   ImageData imgData = null;
   using (System.Net.WebClient wc = new System.Net.WebClient())
   {
     imgData = ImageData.GetImage(wc.DownloadData(imgUrl));
   }
  return imgData;
}

GetImageData ("http://s7d2.scene7.com/is/image/SwissArmy/cm_vm_53900E--111mm_sol_front_a?fmt=jpeg&wid=400&hei=640");