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;
}
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
etgetResourceAsStream
?
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.
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.
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
//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();
}
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();
}