2013-07-12 39 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了解元数据格式的文档以及您可以控制的选项。