Vraag Hoe een BufferedImage als een bestand op te slaan


Ik gebruik de imgscalr Java-bibliotheek om het formaat van een afbeelding te wijzigen.

Het resultaat van een methode voor het wijzigen van de methode resize () is een object BufferedImage. Ik wil dit nu opslaan als een bestand (meestal .jpg).

Hoe kan ik dat doen? Ik wil gaan BufferedImage -> File maar misschien is dit niet de juiste aanpak?


85
2017-10-01 13:16


oorsprong


antwoorden:


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

176
2017-10-01 13:19



U kunt een opslaan BufferedImage object using write methode van de javax.imageio.ImageIO klasse. De handtekening van de methode is als volgt:

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

Hier im is de RenderedImage geschreven worden, formatName is de tekenreeks met de informele naam van het formaat (bijvoorbeeld png) en output is het bestandsobject waarnaar moet worden geschreven. Een voorbeeld van het gebruik van de methode voor de PNG-bestandsindeling wordt hieronder getoond:

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

19
2017-10-01 13:19



Maak en sla een java.awt.image.bufferedImage op in een bestand:

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

Opmerkingen:

  1. Creëert een bestand genaamd MyFile.png.
  2. Afbeelding is 500 bij 500 pixels.
  3. Overschrijft het bestaande bestand.
  4. De kleur van de afbeelding is zwart met een blauwe streep over de bovenkant.

8
2018-04-12 22:13



Het antwoord ligt in de Java-documentatie Tutorial voor het schrijven / opslaan van een afbeelding.

De Image I/O class biedt de volgende methode voor het opslaan van een afbeelding:

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

De tutorial legt dat uit

De klasse BufferedImage implementeert de interface RenderedImage.

dus het kan worden gebruikt in de methode.

Bijvoorbeeld,

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

Het is belangrijk om de write bellen met een probeer blok omdat, als per de API, de methode gooit een IOException "als er een fout optreedt tijdens het schrijven"

Ook worden het doel, de parameters, retouren en worpen van de methode uitgelegd, in meer detail:

Schrijft een afbeelding met een willekeurige ImageWriter die de gegeven indeling ondersteunt in een bestand. Als er al een bestand aanwezig is, wordt de inhoud ervan weggegooid.

parameters:

im - een RenderedImage dat moet worden geschreven.

formatName - een tekenreeks met de informele naam van het formaat.

uitvoer - een bestand waarnaar moet worden geschreven.

Komt terug:

false als er geen geschikte schrijver is gevonden.

Werpt:

IllegalArgumentException - als een parameter null is.

IOException - als er tijdens het schrijven een fout optreedt.

Echter, formatName kan nog steeds vrij vaag en dubbelzinnig lijken; de tutorial maakt het een beetje op:

De methode ImageIO.write roept de code aan die implementeert dat PNG een "PNG writer plug-in" schrijft. De term plug-in wordt gebruikt omdat Image I / O uitbreidbaar is en een breed scala aan indelingen ondersteunt.

Maar de volgende standaard plug-ins voor afbeeldingsformaten: JPEG, PNG, GIF, BMP en WBMP zijn altijd aanwezig.

Voor de meeste toepassingen is het voldoende om een ​​van deze standaard plug-ins te gebruiken. Ze hebben het voordeel dat ze direct beschikbaar zijn.

Er zijn echter nog andere formaten die u kunt gebruiken:

De Image I / O-klasse biedt een manier om ondersteuning in te pluggen voor extra formaten die kunnen worden gebruikt, en veel van dergelijke plug-ins bestaan. Als u geïnteresseerd bent in welke bestandsindelingen beschikbaar zijn om in uw systeem te laden of op te slaan, kunt u de methodes getReaderFormatNames en getWriterFormatNames van de klasse ImageIO gebruiken. Deze methoden retourneren een reeks tekenreeksen waarin alle indelingen worden vermeld die worden ondersteund in deze JRE.

String writerNames[] = ImageIO.getWriterFormatNames();

De geretourneerde array met namen bevat eventuele extra plug-ins die zijn geïnstalleerd en een van deze namen kan worden gebruikt als een indelingsnaam om een ​​afbeeldingsschrijver te selecteren.

Voor een volledig en praktisch voorbeeld, kan men verwijzen naar Oracle's SaveImage.java voorbeeld.


5
2017-12-30 01:36



  1. Downloaden en toevoegen imgscalr-lib-x.x.jar en imgscalr-lib-x.x-javadoc.jar naar uw projectenbibliotheken.
  2. In je code:

    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
2017-10-21 17:03



Als een voering:

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

0
2017-10-01 13:24