wake-up-neo.com

Bild aus einem Dateipfad über BufferedImage laden

Ich habe ein Problem mit der Java-Anwendung, insbesondere beim Laden eines Images von einem Speicherort auf meinem Computer . Folgen Sie this post Ich benutze BufferedImage und InputFileStream, um ein Image in meinen Computer zu laden Ich habe das Bild pic2.jpg in den Quellcode eingefügt, es ist in Ordnung. Zweitens habe ich dieses Bild an eine andere Stelle gestellt (in diesem Fall C:\ImageTest\pic2.jpg). Java IDE zeigt mir eine IllegalArgumentException "input == null" in der Zeile 

return ImageIO.read(in);

. Ich gehe zur Google-Suche, um sicherzustellen, dass die Form des Links, die ich in einen Code eingebe, korrekt ist. Ich weiß also nicht, wo ich etwas falsch gemacht habe. 

hier ist der code:

public class MiddlePanel extends JPanel {
private BufferedImage img;

public MiddlePanel(int width){    


    //img = getImage("pic2.jpg");       
    img = getImage("C:\\ImageTest\\pic2.jpg");

    this.setPreferredSize(new Dimension(800,460));

}
public void paintComponent(Graphics g) {
 .....
}
private BufferedImage getImage(String filename) {
// This time, you can use an InputStream to load
try {
        // Grab the InputStream for the image.                    
        InputStream in = getClass().getResourceAsStream(filename);

    // Then read it in.
    return ImageIO.read(in);
} catch (IOException e) {
    System.out.println("The image was not loaded.");
    //System.exit(1);
}
    return null;
}
10
Lup

getResource & getResourceAsStream arbeiten nicht mit Dateipfaden, sondern Pfaden relativ zur Codebasis. Wenn die Codebasis C: ist, lautet ein relativer Pfad, der die Ressource finden würde, /ImageTest/pic2.jpg.

.. Unterschied zwischen dem Laden der Datei durch FileInputStream und getResourceAsStream?

Ein Hauptunterschied besteht darin, dass der getResource.. mit einer Ressource in einem Jar arbeitet, die keine File mehr ist. Daher kann FileInputStream nicht verwendet werden, um auf eine solche Ressource zuzugreifen.

5
Andrew Thompson

Um eine JPG-Datei aus einem nicht relativen Pfad zu lesen, können Sie Folgendes verwenden:

BufferedImage img = null;

try 
{
    img = ImageIO.read(new File("C:/ImageTest/pic2.jpg")); // eventually C:\\ImageTest\\pic2.jpg
} 
catch (IOException e) 
{
    e.printStackTrace();
}

Ich habe momentan keine Java-Umgebung, ich hoffe also, dass es funktioniert und korrekt geschrieben ist.

13
Tafari

In diesem Fall können Sie Class#getResource(String) oder Class#getResourceAsStream(String) nicht verwenden. Die Regeln für die Suche nach Ressourcen, die einer bestimmten Klasse zugeordnet sind, werden vom definierenden Klassenladeprogramm der Klasse implementiert. Diese Methode delegiert an das Klassenladeprogramm dieses Objekts. Wenn dieses Objekt vom Bootstrap-Klassenlader geladen wurde, delegiert die Methode an ClassLoader.getSystemResourceAsStream(Java.lang.String).

Vor der Delegierung wird ein absoluter Ressourcenname aus dem angegebenen Ressourcennamen mithilfe dieses Algorithmus erstellt:

Wenn der Name mit einem / (\u002f) beginnt, ist der absolute Name der Ressource der Teil des Namens, der auf den /..__ folgt. Andernfalls hat der absolute Name die folgende Form: .__

Dabei ist modified_package_name der Paketname dieses Objekts, wobei / durch . (\u002e) ersetzt wird.

Im Allgemeinen ist es nicht gut, den Systemstandort Ihrer Ressourcen in Ihrem Code fest zu codieren. Die ordentliche und saubere Methode besteht darin, Ihre Ressourcen in Ihrem Klassenpfad abzulegen und darauf zuzugreifen. Hoffe das klärt, warum es nicht funktioniert

4
Keerthivasan
//This code snippet read an image from location on the computer and writes it to a different location on the disk
try {
    byte[] imageInByte;

    BufferedImage imageOnDisk = ImageIO.read(new File("C:\\ImageTest\\pic2.jpg"));

    //Create a ByteArrayOutputStrea object to write image to
    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    //Write the image to the OutputStream
    ImageIO.write(imageOnDisk, "jpg", baos);

    baos.flush();

    //Initialise the byte array object with the image that was written to the OutputStream
    imageInByte = baos.toByteArray();
    baos.close();

    // convert byte array back to BufferedImage
    InputStream in = new ByteArrayInputStream(imageInByte);
    BufferedImage bImageFromConvert = ImageIO.read(in);

    //write the image to a new location with a different file name(optionally)
    ImageIO.write(bImageFromConvert, "jpg", new File(
            "c:\\index.jpg"));
} catch (IOException e) {
    e.printStackTrace();
}
0
Charles

So finden Sie das Bild Breite, Höhe und Größe 

BufferedImage image = null;    
int imageWidth = -1;
int imageHeight = -1;
int fileSize = -1;
try {
    File imageFile = new File(imagePath);
    int fileSize = (int) imageFile.length();
    image = ImageIO.read(imageFile); // Reading the Image from the file system
    imageWidth = image.getWidth();
    imageHeight = image.getHeight();
} catch (IOException e) {
    e.printStackTrace();
}
0
Harjinder Banga