Как сохранить BufferedImage как файл

126

Я использую библиотеку imgscalr Java для изменения размера изображения.

Результатом вызова метода resize () является объект BufferedImage. Теперь я хочу сохранить это как файл (обычно .jpg).

Как я могу это сделать? Я хочу перейти от BufferedImage-> Fileно, может быть, это неправильный подход?

Анкур
источник

Ответы:

239
File outputfile = new File("image.jpg");
ImageIO.write(bufferedImage, "jpg", outputfile);
Вернер Квалем Вестерос
источник
7
Также убедитесь, что выходной файл существует. Если этого не произойдет, write () будет (неправильно) выбросить исключение NullPointerException
Cody S
9
окружить попыткой / уловом.
Lou Morda
Не лови NullPointerException, if (outputfile.exists())
пользуйся
24

Вы можете сохранить BufferedImageобъект, используя метод записи javax.imageio.ImageIOкласса. Сигнатура метода такая:

public static boolean write(RenderedImage im, String formatName, File output) throws IOException

Вот imэто RenderedImageбудет написано, formatNameявляется строка , содержащая неофициальное название формата (например , PNG) и outputявляется объектный файл должен быть записан в. Пример использования метода для формата файла PNG показан ниже:

ImageIO.write(image, "png", file);
Радж Адройт
источник
20

Ответ кроется в Руководстве по написанию / сохранению изображения в документации Java .

Image I/OКласс предоставляет следующий метод для сохранения изображения:

static boolean ImageIO.write(RenderedImage im, String formatName, File output)  throws IOException

В руководстве объясняется, что

Класс BufferedImage реализует интерфейс RenderedImage.

так что его можно использовать в методе.

Например,

try {
    BufferedImage bi = getMyImage();  // retrieve image
    File outputfile = new File("saved.png");
    ImageIO.write(bi, "png", outputfile);
} catch (IOException e) {
    // handle exception
}

Важно окружить writeвызов блоком try, потому что, согласно API , метод выдает сообщение IOException«если во время записи возникает ошибка»

Также объясняются более подробно цель, параметры, возвраты и выбросы метода:

Записывает изображение с помощью произвольного ImageWriter, поддерживающего данный формат, в файл. Если файл уже присутствует, его содержимое отбрасывается.

Параметры:

im - визуализируемое изображение для записи.

formatName - строка, содержащая неофициальное имя формата.

output - файл для записи.

Возвращает:

false, если подходящий писатель не найден.

Броски:

IllegalArgumentException - если какой-либо параметр имеет значение null.

IOException - если при записи возникла ошибка.

Однако formatNameвсе еще может показаться довольно расплывчатым и двусмысленным; руководство немного проясняет это:

Метод ImageIO.write вызывает код, реализующий PNG, записывающий «плагин записи PNG». Термин «подключаемый модуль» используется, поскольку ввод-вывод изображений является расширяемым и может поддерживать широкий спектр форматов.

Но всегда присутствуют следующие плагины стандартных форматов изображений: JPEG, PNG, GIF, BMP и WBMP.

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

Однако вы можете использовать и другие форматы:

Класс Image I / O предоставляет возможность подключаемой поддержки дополнительных форматов, которые можно использовать, и существует множество таких подключаемых модулей. Если вас интересует, какие форматы файлов доступны для загрузки или сохранения в вашей системе, вы можете использовать методы getReaderFormatNames и getWriterFormatNames класса ImageIO. Эти методы возвращают массив строк, в котором перечислены все форматы, поддерживаемые этой JRE.

String writerNames[] = ImageIO.getWriterFormatNames();

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

Полный практический пример можно найти в примере Oracle SaveImage.java.

Картик Чуг
источник
9

Создайте и сохраните java.awt.image.bufferedImage в файл:

import java.io.*;
import java.awt.image.*;
import javax.imageio.*;
public class Main{
    public static void main(String args[]){
        try{
            BufferedImage img = new BufferedImage( 
                500, 500, BufferedImage.TYPE_INT_RGB );

            File f = new File("MyFile.png");
            int r = 5;
            int g = 25;
            int b = 255;
            int col = (r << 16) | (g << 8) | b;
            for(int x = 0; x < 500; x++){
                for(int y = 20; y < 300; y++){
                    img.setRGB(x, y, col);
                }
            }
            ImageIO.write(img, "PNG", f);
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}

Ноты:

  1. Создает файл MyFile.png.
  2. Изображение размером 500 на 500 пикселей.
  3. Заменяет существующий файл.
  4. Цвет изображения черный с синей полосой сверху.
Эрик Лещинский
источник
1
  1. Загрузите и добавьте imgscalr-lib-xxjar и imgscalr-lib-xx-javadoc.jar в свои библиотеки проектов.
  2. В вашем коде:

    import static org.imgscalr.Scalr.*;
    
    public static BufferedImage resizeBufferedImage(BufferedImage image, Scalr.Method scalrMethod, Scalr.Mode scalrMode, int width, int height)  {
        BufferedImage bi = image;
        bi = resize( image, scalrMethod, scalrMode, width, height);
    return bi;
    }
    
    // Save image:
    ImageIO.write(Scalr.resize(etotBImage, 150), "jpg", new File(myDir));
    
Зон
источник
0

В качестве одного лайнера:

ImageIO.write(Scalr.resize(ImageIO.read(...), 150));
Николас Моджик
источник
11
Scalr необъяснимо.
Зон