web-dev-qa-db-fra.com

Charger une image depuis un chemin de fichier via BufferedImage

J'ai un problème avec l'application Java, notamment lors du chargement d'une image à partir d'un emplacement de mon ordinateur . Suivez this post J'utilise BufferedImage et InputFileStream pour charger une image sur mon ordinateur Tout d'abord, J'ai mis l'image pic2.jpg dans le code source, ça va. Cependant, deuxièmement, je mets cette image dans un autre endroit (C:\ImageTest\pic2.jpg dans ce cas), Java IDE me montre une exception IllegalArgumentException "input == null" à la ligne 

return ImageIO.read(in);

. Je vais à la recherche google pour m'assurer que, la forme du lien que j'ai mis dans un code est correcte, donc, je ne sais pas où j'ai mal fait .... 

voici le 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 ne fonctionnent pas avec les chemins de fichiers, mais les chemins relatifs à la base de code. Si la base de code est C:, le chemin relatif permettant de localiser la ressource est /ImageTest/pic2.jpg.

.. différence entre charger le fichier de FileInputStream et getResourceAsStream?

Une différence majeure est que le getResource.. fonctionnera avec une ressource à l'intérieur d'un Jar, qui n'est plus une File. Par conséquent, FileInputStream ne peut pas être utilisé pour accéder à une telle ressource.

5
Andrew Thompson

Pour lire un fichier .jpg à partir d'un chemin non relatif, vous pouvez utiliser ceci:

BufferedImage img = null;

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

Je n'ai pas d'environnement Java pour le moment, alors espérons que cela fonctionne et qu'il est écrit correctement.

13
Tafari

Vous ne pouvez pas utiliser Class#getResource(String) ou Class#getResourceAsStream(String) dans ce cas. Les règles de recherche de ressources associées à une classe donnée sont implémentées par le chargeur de classe qui définit la classe. Cette méthode délègue au chargeur de classes de cet objet. Si cet objet a été chargé par le chargeur de classes d'amorçage, la méthode délègue à ClassLoader.getSystemResourceAsStream(Java.lang.String).

Avant la délégation, un nom de ressource absolu est construit à partir du nom de ressource donné en utilisant cet algorithme:

Si le nom commence par un / (\u002f), le nom absolu de la ressource est la partie du nom qui suit le /. Sinon, le nom absolu est de la forme suivante:

Où modified_package_name est le nom du package de cet objet, avec / remplacé par . (\u002e).

Généralement, il n'est pas bon de coder en dur l'emplacement système de vos ressources dans votre code. La méthode la plus simple consiste à placer vos ressources dans votre chemin de classe et à y accéder. J'espère que cela clarifie pourquoi cela ne fonctionne pas

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

Pour trouver l'image Largeur, hauteur et taille 

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