Cách lưu BufferedImage dưới dạng tệp


125

Tôi đang sử dụng thư viện Java imgscalr để thay đổi kích thước hình ảnh.

Kết quả của một cuộc gọi phương thức resize () là một đối tượng BufferedImage. Bây giờ tôi muốn lưu nó dưới dạng tệp (thường là .jpg).

Làm thế nào tôi có thể làm điều đó? Tôi muốn đi từ BufferedImage-> Filenhưng có lẽ đây không phải là cách tiếp cận chính xác?

Câu trả lời:


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

7
Ngoài ra, hãy đảm bảo rằng tệp đầu ra tồn tại. Nếu không, write () sẽ (không chính xác) ném một NullPointerException
Cody S

9
bao quanh bằng một thử / bắt.
Lou Morda

Đừng bắt NullPointerException, hãy sử dụngif (outputfile.exists())
Danon

24

Bạn có thể lưu một BufferedImageđối tượng bằng cách sử dụng phương thức ghi của javax.imageio.ImageIOlớp. Chữ ký của phương thức này như sau:

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

Đây imlà phần RenderedImageđược viết, formatNamelà Chuỗi chứa tên không chính thức của định dạng (ví dụ: png) và outputlà đối tượng tệp được ghi vào. Dưới đây là một ví dụ sử dụng phương pháp cho định dạng tệp PNG:

ImageIO.write(image, "png", file);

20

Câu trả lời nằm trong Hướng dẫn Viết / Lưu Hình ảnh của Tài liệu Java .

Các Image I/Olớp học cung cấp các phương pháp sau đây để tiết kiệm một hình ảnh:

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

Hướng dẫn giải thích rằng

Lớp BufferedImage thực hiện giao diện RenderImage.

vì vậy nó có thể được sử dụng trong phương thức.

Ví dụ,

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

Điều quan trọng là phải bao quanh writecuộc gọi bằng một khối thử bởi vì theo API , phương thức này đưa ra mộtIOException "nếu có lỗi xảy ra trong quá trình ghi"

Cũng được giải thích chi tiết hơn về mục tiêu, tham số, trả về và ném của phương pháp:

Viết ảnh bằng ImageWriter tùy ý hỗ trợ định dạng nhất định cho một Tệp. Nếu đã có một tệp, nội dung của nó sẽ bị loại bỏ.

Thông số:

im - một Hình ảnh được kết xuất sẽ được viết.

formatName - một Chuỗi chứa tên không chính thức của định dạng.

đầu ra - một Tệp được ghi vào.

Lợi nhuận:

sai nếu không tìm thấy người viết thích hợp.

Ném:

IllegalArgumentException - nếu bất kỳ tham số nào là rỗng.

IOException - nếu lỗi xảy ra trong quá trình viết.

Tuy nhiên, formatNamecó vẻ vẫn còn khá mơ hồ và mơ hồ; hướng dẫn rõ ràng hơn một chút:

Phương thức ImageIO.write gọi mã thực hiện PNG viết “trình cắm người viết PNG”. Thuật ngữ plug-in được sử dụng vì Image I / O có thể mở rộng và có thể hỗ trợ nhiều định dạng.

Nhưng các plugin định dạng hình ảnh tiêu chuẩn sau: JPEG, PNG, GIF, BMP và WBMP luôn có mặt.

Đối với hầu hết các ứng dụng, chỉ cần sử dụng một trong các plugin tiêu chuẩn này là đủ. Chúng có lợi thế là sẵn có.

Tuy nhiên, có những định dạng bổ sung mà bạn có thể sử dụng:

Lớp Image I / O cung cấp một cách để bổ sung hỗ trợ cho các định dạng bổ sung có thể được sử dụng và nhiều trình cắm như vậy tồn tại. Nếu bạn quan tâm đến định dạng tệp nào có sẵn để tải hoặc lưu trong hệ thống của mình, bạn có thể sử dụng các phương thức getReaderFormatNames và getWriterFormatNames của lớp ImageIO. Các phương thức này trả về một mảng chuỗi liệt kê tất cả các định dạng được hỗ trợ trong JRE này.

String writerNames[] = ImageIO.getWriterFormatNames();

Dãy tên được trả về sẽ bao gồm bất kỳ trình cắm bổ sung nào được cài đặt và bất kỳ tên nào trong số này có thể được sử dụng làm tên định dạng để chọn trình ghi hình ảnh.

Để có một ví dụ đầy đủ và thực tế, người ta có thể tham khảo ví dụ của Oracle SaveImage.java.


9

Tạo và lưu java.awt.image.bufferedImage vào tệp:

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

Ghi chú:

  1. Tạo một tệp có tên MyFile.png.
  2. Hình ảnh có kích thước 500 x 500 pixel.
  3. Ghi đè tệp hiện có.
  4. Màu của hình ảnh là màu đen với một sọc màu xanh lam trên đầu.

1
  1. Tải xuống và thêm imgscalr-lib-xxjarimgscalr-lib-xx-javadoc.jar vào Thư viện dự án của bạn.
  2. Trong mã của bạn:

    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

Như một lớp lót:

ImageIO.write(Scalr.resize(ImageIO.read(...), 150));

11
Scalr không giải thích được.
Zon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.