Jak zapisać BufferedImage jako plik


126

Używam imgscalr biblioteki Java, aby zmienić rozmiar obrazu.

Wynikiem wywołania metody resize () jest obiekt BufferedImage. Chcę teraz zapisać to jako plik (zwykle .jpg).

Jak mogę to zrobić? Chcę odejść BufferedImage-> Fileale może to nie jest właściwe podejście?

Odpowiedzi:


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

7
Upewnij się również, że istnieje plik wyjściowy. Jeśli tak się nie stanie, write () wyrzuci (niepoprawnie) wyjątek NullPointerException
Cody S

9
otoczyć próbą / złapaniem.
Lou Morda,

Nie łapaj NullPointerException, używajif (outputfile.exists())
Danon

24

Możesz zapisać BufferedImageobiekt używając metody write javax.imageio.ImageIOklasy. Podpis metody wygląda następująco:

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

Tutaj imjest RenderedImagetekst do zapisania, formatNameto ciąg znaków zawierający nieformalną nazwę formatu (np. Png) i outputobiekt pliku do zapisania. Przykładowe użycie metody dla formatu pliku PNG jest pokazane poniżej:

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

20

Odpowiedź znajduje się w samouczku dokumentacji Java dotyczącym pisania / zapisywania obrazu .

Image I/OKlasa zawiera następujące metody zapisywania obrazu:

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

Samouczek wyjaśnia to

Klasa BufferedImage implementuje interfejs RenderedImage.

więc można go użyć w metodzie.

Na przykład,

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

Ważne jest, aby otoczenie writewywołania blokiem try, ponieważ zgodnie z interfejsem API metoda zgłasza plikIOException „jeśli podczas pisania wystąpi błąd”

Bardziej szczegółowo wyjaśniono również cel metody, parametry, zwroty i rzuty:

Zapisuje obraz przy użyciu dowolnego ImageWriter, który obsługuje dany format w File. Jeśli istnieje już plik, jego zawartość jest odrzucana.

Parametry:

im - RenderedImage do napisania.

formatName - ciąg zawierający nieformalną nazwę formatu.

wyjście - plik do zapisania.

Zwroty:

fałsz, jeśli nie znaleziono odpowiedniego pisarza.

Rzuty:

IllegalArgumentException - jeśli którykolwiek parametr ma wartość null.

IOException - jeśli wystąpi błąd podczas zapisu.

Jednak formatNamenadal może wydawać się raczej niejasne i niejednoznaczne; samouczek wyjaśnia to trochę:

Metoda ImageIO.write wywołuje kod, który implementuje format PNG, pisząc „wtyczkę zapisującą PNG”. Termin wtyczka jest używany, ponieważ Image I / O jest rozszerzalny i może obsługiwać szeroką gamę formatów.

Jednak zawsze obecne są następujące standardowe wtyczki formatu obrazu: JPEG, PNG, GIF, BMP i WBMP.

W przypadku większości aplikacji wystarczy użyć jednej z tych standardowych wtyczek. Mają tę zaletę, że są łatwo dostępne.

Istnieją jednak dodatkowe formaty, których możesz użyć:

Klasa Image I / O umożliwia podłączenie obsługi dodatkowych formatów, które mogą być używane, a istnieje wiele takich wtyczek. Jeśli interesuje Cię, jakie formaty plików są dostępne do załadowania lub zapisania w Twoim systemie, możesz skorzystać z metod getReaderFormatNames i getWriterFormatNames klasy ImageIO. Te metody zwracają tablicę ciągów zawierającą wszystkie formaty obsługiwane w tym środowisku JRE.

String writerNames[] = ImageIO.getWriterFormatNames();

Zwrócona tablica nazw będzie zawierała wszelkie dodatkowe zainstalowane wtyczki, a dowolne z tych nazw mogą zostać użyte jako nazwa formatu w celu wybrania programu do zapisywania obrazów.

Pełny i praktyczny przykład można znaleźć w przykładzie Oracle SaveImage.java.


9

Utwórz i zapisz java.awt.image.bufferedImage do pliku:

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

Uwagi:

  1. Tworzy plik o nazwie MyFile.png.
  2. Obraz ma wymiary 500 na 500 pikseli.
  3. Zastępuje istniejący plik.
  4. Kolor obrazu jest czarny z niebieskim paskiem na górze.

1
  1. Pobierz i dodaj imgscalr-lib-xxjar i imgscalr-lib-xx-javadoc.jar do swoich bibliotek projektów.
  2. W swoim kodzie:

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.