2010-05-25 169 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);