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