Charger l'image à partir d'un chemin de fichiers via BufferedImage


J'ai un problème avec l'application Java, en particulier lors du chargement d'une image à partir d'un emplacement sur mon ordinateur. Suivez ce post J'utilise BufferedImage et InputFileStream pour charger une image sur mon ordinateur Tout d'abord, j'ai mis la photo 2.image jpg dans le code source, c'est bien. Cependant, deuxièmement, j'ai mis cette image dans un autre endroit (C:\ImageTest\pic2.jpg dans ce cas), Java ID me montre une exception IllegalArgumentException "input = = null" à la ligne

return ImageIO.read(in);

. Je vais à la recherche Google pour m'assurer que, la forme de lien que j'ai mise dans un code est correcte, donc je ne sais pas où j'ai mal agi....

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;
}
Author: Andrew Thompson, 2013-10-18

5 answers

getResource & getResourceAsStream ne travaillez pas avec des chemins de fichiers, mais des chemins relatifs à la base de code. Si la base de code est C: alors un chemin relatif qui localiserait la ressource est /ImageTest/pic2.jpg.

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

Une différence importante est que la getResource.. travaillera avec des ressources à l'intérieur d'un Pot, qui n'est plus un File. Donc FileInputStream ne peut pas être utilisé pour accéder à cette ressource.

 5
Author: Andrew Thompson, 2013-10-18 10:32:05

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 j'espère que cela fonctionne et est écrit correctement.

 12
Author: Tafari, 2013-10-20 09:09:06

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 définissant la classe. Cette méthode délègue au chargeur de classe de cet objet. Si cet objet a été chargé par le chargeur de classe bootstrap, la méthode délègue à ClassLoader.getSystemResourceAsStream(java.lang.Chaîne).

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

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

Où le modified_package_name est le nom du paquet de cet objet avec '/' substitué à '.'('\u002e').

Généralement, ce n'est pas une bonne chose de coder en dur l'emplacement système de vos ressources dans votre code. La façon soignée et propre est de mettre votre ressources dans votre chemin de classe et y accéder. J'espère que cela clarifie pourquoi cela ne fonctionne pas

 3
Author: Keerthivasan, 2013-10-18 10:29:00
    //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("f:\\promotions\\4port usb hub.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
Author: Charles, 2015-10-15 15:17:50

Pour trouver la largeur, la hauteur et la taille de l'image

BufferedImage bimg = null;    
 String imageWHS = null;
    try {
        File imgObj = new File(imagePath);// Loading an image from local path
        int fileSize = (int) imgObj.length();// Used to find image size
        bimg = ImageIO.read(imgObj);// Now the file object send to buffered image, used to find image height and length
        imageWHS = bimg.getWidth()+"x"+bimg.getHeight()+"x"+Integer.toString(fileSize);
    } catch (IOException e) {
        e.printStackTrace();
    }
 0
Author: Harjinder Banga, 2017-08-23 17:12:46