2013-07-12 1 views
1

Я искал некоторые решения из Интернета, но я до сих пор не нашел ответа на свою проблему.ImageIO сохраняет исходный размер

Я работаю или выполняю программу, которая будет получать файл изображения с моего ПК, после чего будет отредактирован с помощью Java Graphics, чтобы добавить текст/объект/и т. Д. После этого Java ImageIO сохранит только что измененное изображение.

До сих пор я был в состоянии сделать это красиво, но у меня возникла проблема с размером изображения. Исходное изображение и измененное изображение не имели такого же размера.

Оригинал 2x3 дюймов-изображение, в то время как модифицированный, который предположительно имеет 2x3inches, слишком грустно получил 8x14 дюймов. Таким образом, он стал БОЛЬШИМ, чем оригинальный.

Что такое решение/код, который даст мне результат 2x3inches-image, который по-прежнему будет иметь «хорошее качество»?

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(); 
    } 
} 

второй UPDATE:

теперь я знаю, что это проблема нового образа. Когда я проверяю его из Photoshop, у него другое разрешение изображения по сравнению с оригинальным. Оригинал имеет 300 пикселей/дюйм, в то время как новое изображение имеет разрешение 72 пикселя/дюйм.

Как я могу изменить разрешение с помощью Java?

+0

Вопрос немного общий, но я предполагаю, что вы сохраняете формат с другой настройкой DPI. Отправьте код, и мы можем попытаться помочь. –

+1

Просьба указать [SSCCE] (http://sscce.org/) вашей проблемы. – mattbdean

+0

Странно. Каждое преобразование на Graphics2D должно быть отражено обратным преобразованием. Я не знаю, но это единственное объяснение. Нужна ли обрезка? –

ответ

2

Чтобы установить разрешение изображения (сегмента JFIF), вы, вероятно, можете использовать IIOMetatada для JPEG.

Что-то вдоль линий:

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 для документации по формату метаданных и с какими параметрами вы можете управлять.