Изменение размера изображения с помощью Java

У меня есть основное изображение JPEG, имеющее размерность, и входное изображение Jpeg другого измерения. Итак, я написал следующий код для преобразования изображения из одного измерения в другое. Этот код отлично работает, когда входные изображения имеют размеры около 900 * 700, а основное изображение — 1200 * 800. Это не работает, когда основные/входные изображения имеют размеры 3400*1900 и 4400*2400. Может ли кто-нибудь сказать мне, где я ошибся!

public void checkSizeandResize(String file1, String file2){

   BufferedImage scaled = null;
   BufferedImage image1 = null;
   BufferedImage image2 = null;
   Graphics2D graphics2d = null;
   try{
    image1 = imageToBufferedImage(loadJPG(file1));
    image2 = imageToBufferedImage(loadJPG(file2));
    if(image1.getHeight()!=image2.getHeight() || image1.getWidth()!=image2.getWidth()){

            scaled = new BufferedImage(image2.getWidth(),image2.getHeight(), image2.getType());
            graphics2d =  scaled.createGraphics();
            graphics2d.setComposite(AlphaComposite.Src);
            graphics2d.drawImage(image1, 0, 0,null);
            graphics2d.dispose();
            ImageIO.write(image1, extension,new File(file2));

        }
    }
    catch(Exception exception)
    {
        exception.printStackTrace();
    }
    finally
    {
        scaled = null;
        image1 = null;
        image2 = null;
        graphics2d = null;
    }
}

person byreddy    schedule 29.05.2015    source источник
comment
Что делает imageToBufferedImage(loadJPG(...))? Вы понимаете, что на самом деле это ничего не масштабирует? Вы получаете какие-либо ошибки (например, нехватка памяти)?   -  person MadProgrammer    schedule 30.05.2015
comment
Этот метод просто преобразует изображение в буферизованный java.awt.Image, например BufferedImage bi = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB);   -  person byreddy    schedule 30.05.2015
comment
Любая причина, по которой вы не можете использовать ImageIO.read?   -  person MadProgrammer    schedule 30.05.2015
comment
Ошибки не увидел, но не конвертирует в нужный размер   -  person byreddy    schedule 30.05.2015
comment
Вы можете взглянуть на это и это   -  person MadProgrammer    schedule 30.05.2015
comment
Уточните, пожалуйста, не работает. Это создает пустой образ? Размер изображения не меняется?   -  person Jongware    schedule 30.05.2015
comment
Размер изображения не изменен.   -  person byreddy    schedule 30.05.2015


Ответы (1)


Итак, я провел быстрый тест (используя ImageIO.read, так как вы не предоставили весь код) с изображением, без проблем меняющимся с 6144x4096 на 7680x4800.

Но я заметил, что вы пишете image1 вместо scaled

ImageIO.write(image1, extension,new File(file2));

Вероятно, должно быть

ImageIO.write(scaled, extension,new File(file2));

Вы также должны помнить, что на самом деле это не «масштабирование» изображения, а просто изменение размера результирующего растрового изображения (image1 останется с исходным размером в пикселях и будет окрашено в границах scaled без изменений)

Если вы действительно заинтересованы в изменении физического размера изображения в соответствии с соответствующими границами, вы можете взглянуть на Java: сохранение соотношения сторон фонового изображения JPanel и Качество изображения после изменения размера очень низкое -- Java

person MadProgrammer    schedule 29.05.2015
comment
Есть ли у вас какие-либо идеи о том, как код OP работал с меньшими изображениями? - person Jongware; 30.05.2015
comment
@Jongware Я думаю, что это работает, это фраза. Мне пришлось несколько раз почесать голову, пытаясь понять, почему я не получал ожидаемых результатов, пока не обнаружил проблему: P - person MadProgrammer; 30.05.2015
comment
Я пробовал по первой ссылке, он показывает ошибку как неподдерживаемую операцию. масштабируемый = image1.getScaledInstance (image2.getWidth (null), image2.getHeight (null), Image.SCALE_SMOOTH); graphics2d = масштабируемый.getGraphics(); - person byreddy; 30.05.2015
comment
@BYKR На какой линии? Там двое? И вы импортируете java.awt.Image? - person MadProgrammer; 30.05.2015
comment
Ответ, который вы дали, сработал. Но вы даете 2 ссылки в предыдущих комментариях. Итак, я попытался использовать первую ссылку для достижения задачи. Первая ссылка у меня не работала. stackoverflow.com/questions/11959758/ - person byreddy; 30.05.2015
comment
@BYKR Да, я понимаю, но вы вставили две строки кода, которые вы комментируете, и я пытался выяснить, какая из них не работает. Тот факт, что он не работает для вас, удивителен, потому что я использую его более 15 лет. - person MadProgrammer; 30.05.2015
comment
Прости меня, если я ошибаюсь, ведь я всего лишь новичок. - person byreddy; 30.05.2015
comment
Масштаб изображения = ноль; Графика Graphics2d = ноль; Изображение изображение1 = загрузитьJPG(файл1); Изображение изображение2 = загрузитьJPG(файл2); масштабируемый = image1.getScaledInstance (image2.getWidth (null), image2.getHeight (null), Image.SCALE_SMOOTH); graphics2d = масштабируемый.getGraphics(); Graphics2d.drawImage (масштабируется, image2.getWidth (null), image2.getHeight (null), null); выдает java.lang.UnsupportedOperationException: getGraphics() недействителен для изображений, созданных с помощью createImage(producer) . Мне приходится работать без использования апплетов. - person byreddy; 30.05.2015
comment
Что ж, если вы можете использовать ImageIO.write, почему бы не использовать вместо этого ImageIO.read? - person MadProgrammer; 30.05.2015
comment
Наконец, после использования graphics2d.drawImage(image1, 0, 0,image2.getWidth(),image2.getHeight(),null); Это сработало. Спасибо - person byreddy; 30.05.2015