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