2013-07-12 43 views
1

我一直在尋找一些來自互聯網的解決方案,但我仍然沒有找到我的問題的答案。ImageIO保存回原來的尺寸

我一直在工作或做一個程序,將從我的電腦獲取圖像文件,然後將使用Java Graphics編輯添加一些文本/對象/等。之後,Java ImageIO將保存新修改的圖像。

到目前爲止,我能夠很好地做到這一點,但我得到了一個關於圖像大小的問題。原始圖像和修改後的圖像的大小不一樣。

原始爲2x3英寸圖像,而修改後的圖像應該具有2x3英寸,太難以承受8x14英寸。所以,它比原來的更大了。

什麼是解決方案/代碼,會給我一個2x3英寸圖像的輸出,它仍然會有一個「不錯的質量」?

UPDATE:

所以,這裏是我使用的代碼。

public Picture(String filename) { 
    try { 
     File file = new File("originalpic.jpg"); 
     image = ImageIO.read(file); 
     width = image.getWidth(); 
    } 
    catch (IOException e) { 
     throw new RuntimeException("Could not open file: " + filename); 
    } 
} 

private void write(int id) { 
    try { 
     ImageIO.write(image, "jpg", new File("newpic.jpg")); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

月2日更新:

我現在知道什麼是新形象的問題。當我從Photoshop中檢查它時,它具有與原始圖像分辨率不同的圖像分辨率。原始尺寸爲300像素/英寸,而新圖像的分辨率爲72像素/英寸。

我將如何使用Java更改分辨率?

+0

這個問題有點普遍,但我的猜測是你保存在一個不同的DPI設置格式。發佈一些代碼,我們可以嘗試幫助。 –

+1

請發佈您的問題的[SSCCE](http://sscce.org/)。 – mattbdean

+0

奇怪。 Graphics2D上的每個轉換都應該通過反轉來鏡像。 _我不知道,但這似乎是唯一的解釋._剪切需要? –

回答

2

要設置圖像分辨率(JFIF段),您可以使用JPEG的IIOMetatada

東西線沿線的:

public class MetadataTest { 
    public static void main(String[] args) throws IOException { 
     BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_3BYTE_BGR); 

     ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next(); 
     writer.setOutput(ImageIO.createImageOutputStream(new File("foo.jpg"))); 
     ImageWriteParam param = writer.getDefaultWriteParam(); 

     IIOMetadata metadata = writer.getDefaultImageMetadata(ImageTypeSpecifier.createFromRenderedImage(image), param); 
     IIOMetadataNode root = (IIOMetadataNode) metadata.getAsTree(metadata.getNativeMetadataFormatName()); 
     IIOMetadataNode jfif = (IIOMetadataNode) root.getElementsByTagName("app0JFIF").item(0); 

     jfif.setAttribute("resUnits", "1"); 
     jfif.setAttribute("Xdensity", "300"); 
     jfif.setAttribute("Ydensity", "300"); 

     metadata.mergeTree(metadata.getNativeMetadataFormatName(), root); 

     writer.write(null, new IIOImage(image, null, metadata), param); 
    } 
} 

注:此代碼應不應該完全使用,但加入迭代,錯誤處理,流閉等,雜波的例子太多了。

請參閱JPEG Image Metadata DTD瞭解元數據格式的文檔以及您可以控制的選項。