2010-05-25 110 views
6

我正在使用iText将图像输出到PDF文件。图像总是显得比他们想象的要大。根据该书(iText in Action),这是因为iText始终以72 dpi的分辨率显示图像,而不管图像的实际dpi属性如何。本书建议使用image.getDpiX()查找图像的dpi,然后使用image.scalePercent(72/actualDpi * 100)正确显示图像。到目前为止,我所有图像的getDpiX()属性已经返回0(我已经尝试了2个gif和1个jpg)。是否有另一种方法来计算出实际的DPI,以便我的图像正确缩放?Java图像缩放

com.lowagie.text.Image graphic = com.lowagie.text.Image.getInstance(imgPath); 
float actualDpi = graphic.getDpiX(); 
if (actualDpi > 0) 
    //Never gets here 
    graphic.scalePercent(72f/actualDpi * 100); 

回答

0

对于GIF,没有存储文件在“DPI”信息的地方,所以“actualDpi”在这种情况下,没有任何意义。对于JPEG,“DPI”信息可以存储在文件中,但不是强制性的,如果没有设置:“actualDPI”也没有意义。 真正的答案是:没有像“实际DPI”那样的东西,要么提供信息(即“在这个图像中,我想要用这个特定的物理宽度(或高度)渲染1个像素”),或者它是不。另一个因素是在你的句子中:“总是显得比他们应该的大”; “应该”是存储在图像中的DPI信息。因此,如果这些信息不存在,并且您感觉到当您打开图像时它看起来正好在屏幕上,那么您必须计算屏幕的密度(以像素数为单位的宽度除以屏幕以英寸为单位的宽度),并用它作为你的“actualDPI”变量。

1

根据com.lowagie.text.Image JavaDoc,getDpiX方法获取X方向上的每英寸点数。如果不可用,则返回零。

当getDpiX方法返回零时,您将不得不假设一个值。 100 dpi与任何假设一样好。

if (actualDpi <= 0) actualDpi = 100f; 
graphic.scalePercent(72f/actualDpi * 100f); 
0

屏幕分辨率,通过

java.awt.Toolkit.getDefaultToolkit().getScreenResolution() 

检索没有帮助,图像仍然过大。但是,可以通过以下方式将图像缩放到页面宽度:

BufferedImage bufferedImage = null; // your image 
Image image = Image.getInstance(bufferedImage,null); 
image.scalePercent((document.right()-document.left())/((float)image.getWidth())*100);