Як зберегти BufferedImage як файл


125

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

Результатом виклику методу resize () є об'єкт BufferedImage. Тепер я хочу зберегти це як файл (зазвичай .jpg).

Як я можу це зробити? Я хочу піти з BufferedImage-> Fileале, можливо, це не правильний підхід?

Відповіді:


238
File outputfile = new File("image.jpg");
ImageIO.write(bufferedImage, "jpg", outputfile);

7
Також переконайтеся, що вихідний файл існує. Якщо цього не відбудеться, файл write () викине NullPointerException
Cody S

9
оточіть спробувати.
Лу Морда

Не лови 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 Documentation для написання / збереження зображення .

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

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

Підручник пояснює це

Клас BufferedImage реалізує інтерфейс RenderImage.

тому його можна використовувати в методі.

Наприклад,

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

Важливо оточити writeвиклик блоком спробу, оскільки, відповідно до API , метод видає IOException"якщо помилка виникає під час запису"

Також пояснюються цілі методу, параметри, повернення та кидки, більш детально:

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

Параметри:

im - зображення, що має бути записане.

formatName - рядок, що стосується неформальної назви формату.

output - файл, в який слід записати.

Повернення:

помилково, якщо не знайдено відповідного письменника.

Кидає:

IllegalArgumentException - якщо будь-який параметр є нульовим.

IOException - якщо під час написання сталася помилка.

Однак це formatNameможе здатися досить невиразним та неоднозначним; навчальний посібник трохи це очищає:

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

Але такі стандартні плагіни формату зображення: JPEG, PNG, GIF, BMP та WBMP завжди присутні.

Для більшості програм достатньо використовувати один із цих стандартних плагінів. Вони мають перевагу в доступності.

Однак є додаткові формати, якими ви можете скористатися:

Клас вводу-виводу Image забезпечує спосіб підключення додаткових форматів, які можна використовувати, і існує багато таких плагінів. Якщо вас цікавить, які формати файлів доступні для завантаження або збереження у вашій системі, ви можете використовувати методи 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));

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.