วิธีบันทึก BufferedImage เป็นไฟล์


126

ฉันใช้ไลบรารี imgscalr Java เพื่อปรับขนาดรูปภาพ

ผลลัพธ์ของการเรียกเมธอด resize () คืออ็อบเจ็กต์ BufferedImage ตอนนี้ฉันต้องการบันทึกเป็นไฟล์ (โดยปกติคือ. jpg)

ฉันจะทำเช่นนั้นได้อย่างไร? ฉันต้องการไปจากBufferedImage-> Fileแต่บางทีนี่อาจไม่ใช่แนวทางที่ถูกต้อง?

คำตอบ:


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

7
ตรวจสอบให้แน่ใจว่ามีไฟล์เอาต์พุตอยู่ ถ้าไม่เป็นเช่นนั้นเขียน () จะ (ไม่ถูกต้อง) โยน 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คือ String ที่มีชื่อทางการของรูปแบบ (เช่น 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 blockเนื่องจากตามAPIวิธีนี้จะแสดงข้อความIOException"หากเกิดข้อผิดพลาดระหว่างการเขียน"

นอกจากนี้ยังอธิบายถึงวัตถุประสงค์พารามิเตอร์ผลตอบแทนและการโยนของวิธีการในรายละเอียดเพิ่มเติม:

เขียนภาพโดยใช้ ImageWriter โดยพลการที่สนับสนุนรูปแบบที่กำหนดให้กับไฟล์ หากมีไฟล์อยู่แล้วเนื้อหาจะถูกละทิ้ง

พารามิเตอร์:

im - RenderedImage ที่จะเขียน

formatName - สตริงที่เชื่อมโยงกับชื่อทางการของรูปแบบ

เอาต์พุต - ไฟล์ที่จะเขียน

ผลตอบแทน:

เท็จหากไม่พบตัวเขียนที่เหมาะสม

โยน:

IllegalArgumentException - ถ้าพารามิเตอร์ใด ๆ เป็นโมฆะ

IOException - หากเกิดข้อผิดพลาดระหว่างการเขียน

อย่างไรก็ตามformatNameอาจยังดูค่อนข้างคลุมเครือและคลุมเครือ บทช่วยสอนจะล้างมันเล็กน้อย:

เมธอด ImageIO.write เรียกโค้ดที่ใช้ PNG เขียน "ปลั๊กอินตัวเขียน PNG" คำว่าปลั๊กอินถูกใช้เนื่องจาก Image I / O สามารถขยายได้และรองรับรูปแบบได้หลากหลาย

แต่จะมีปลั๊กอินรูปแบบรูปภาพมาตรฐานต่อไปนี้: JPEG, PNG, GIF, BMP และ WBMP อยู่เสมอ

สำหรับแอปพลิเคชันส่วนใหญ่ก็เพียงพอที่จะใช้หนึ่งในปลั๊กอินมาตรฐานเหล่านี้ พวกเขามีข้อได้เปรียบในการพร้อมใช้งาน

อย่างไรก็ตามมีรูปแบบเพิ่มเติมที่คุณสามารถใช้ได้:

คลาส I / O ของอิมเมจมีวิธีในการเชื่อมต่อการสนับสนุนสำหรับรูปแบบเพิ่มเติมที่สามารถใช้ได้และมีปลั๊กอินดังกล่าวจำนวนมาก หากคุณสนใจในรูปแบบไฟล์ที่พร้อมให้โหลดหรือบันทึกในระบบของคุณคุณอาจใช้เมธอด getReaderFormatNames และ getWriterFormatNames ของคลาส ImageIO วิธีการเหล่านี้ส่งคืนอาร์เรย์ของสตริงที่แสดงรายการรูปแบบทั้งหมดที่สนับสนุนใน JRE นี้

String writerNames[] = ImageIO.getWriterFormatNames();

อาร์เรย์ของชื่อที่ส่งคืนจะรวมปลั๊กอินเพิ่มเติมที่ติดตั้งไว้และอาจใช้ชื่อเหล่านี้เป็นชื่อรูปแบบเพื่อเลือกโปรแกรมเขียนภาพ

สำหรับตัวอย่างที่สมบูรณ์และใช้งานได้จริงเราสามารถอ้างถึงตัวอย่างของ OracleSaveImage.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 x 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));
    

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.