it-swarm.com.ru

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

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

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

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

100
Ankur
File outputfile = new File("image.jpg");
ImageIO.write(bufferedImage, "jpg", outputfile);
196
Werner Kvalem Vesterås

Вы можете сохранить объект 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);
19
Raj Adroit

Создать и сохранить 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. Цвет изображения - черный с синей полосой сверху.
9
Eric Leschinski

Ответ лежит в Учебное пособие по 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 - RenderedImage для записи.

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

output - файл, в который нужно записать.

Возвращает:

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

Броски:

IllegalArgumentException - если любой параметр является нулем.

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.

6
K_7
  1. Загрузите и добавьте imgscalr-lib-x.x.jar и imgscalr-lib-x.x-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));
    
1
Zon

Как один лайнер:

ImageIO.write(Scalr.resize(ImageIO.read(...), 150));
0
Nicolas Modrzyk