Charger l'image à partir d'un filepath via BufferedImage

j'ai un problème avec L'application Java, en particulier dans le chargement d'une image à partir d'un emplacement dans mon ordinateur. Suivez post J'utilise BufferedImage et InputFileStream pour charger une image dans mon ordinateur Tout d'abord, j'ai mis la photo 2.image jpg dans le code source, c'est bon. Cependant, deuxièmement, j'ai mis cette image dans un autre endroit (C:ImageTestpic2.jpg dans ce cas), Java IDE me montrer une IllegalArgumentException "input == null" à la ligne

return ImageIO.read(in);

. Je vais à google search to assurez-vous 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:ImageTestpic2.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
demandé sur Andrew Thompson 2013-10-18 14:13:24

5 réponses

getResource& getResourceAsStream ne fonctionne pas avec les chemins de fichier, mais les 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 charge par FileInputStream et getResourceAsStream?

une différence majeure est que le getResource.. fonctionne avec une ressource à l'intérieur d'un Pot, qui n'est plus un File. Donc FileInputStream ne peut pas être utilisé pour accéder à un tel ressources.

5
répondu Andrew Thompson 2013-10-18 10:32:05

Pour lire un .fichier jpg de non-chemin 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, donc j'espère qu'il fonctionne et qu'il est correctement écrit.

12
répondu 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 des ressources associées à une classe donnée sont implémentées par le chargeur de classe de 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 délégation, un nom de ressource absolu est construit à partir du nom de ressource donné en utilisant ce 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 nom modifié_package_name est le nom du paquet de cet objet avec ' / 'substitué pour'."('\u002e').

en général, ce n'est pas une bonne chose de hardcode l'emplacement du système de vos ressources dans votre code. Le net et propre façon est de mettre vos ressources dans votre classpath et d'y accéder. Espérons que cela clarifie pourquoi cela ne fonctionne pas

3
répondu 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
répondu 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
répondu Harjinder Banga 2017-08-23 17:12:46