Загрузить изображение из пути к файлу через BufferedImage
У меня проблема с приложением Java, особенно при загрузке изображения из местоположения на моем компьютере.
Следуйте этой почте
Я использую BufferedImage и InputFileStream для загрузки изображения на моем компьютере
Во-первых, я положил изображение pic2.jpg в исходный код, это прекрасно. Однако, во-вторых, я помещаю это изображение в другое место (C:\ImageTest\pic2.jpg в этом случае), Java IDE показывает мне IllegalArgumentException "input == null" в строке
return ImageIO.read(in);
. Я перехожу к поиску google, чтобы убедиться, что форма ссылки, которую я вложил в код, верна, поэтому я не знаю, где я ошибся....
вот код:
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;
}
Ответы
Ответ 1
getResource
и getResourceAsStream
не работают с файловыми путями, но пути относительно базы кода. Если база кода C:
, то относительный путь, который будет определять ресурс, равен /ImageTest/pic2.jpg
.
.. разница между файлом загрузки FileInputStream
и getResourceAsStream
?
Одно существенное отличие состоит в том, что getResource..
будет работать с ресурсом внутри Jar, который больше не является File
. Поэтому FileInputStream
не может использоваться для доступа к такому ресурсу.
Ответ 2
Чтобы прочитать файл .jpg из не относительного пути, вы можете использовать это:
BufferedImage img = null;
try
{
img = ImageIO.read(new File("C:/ImageTest/pic2.jpg")); // eventually C:\\ImageTest\\pic2.jpg
}
catch (IOException e)
{
e.printStackTrace();
}
В настоящий момент у меня нет среды Java, поэтому надеюсь, что она работает и написана правильно.
Ответ 3
В этом случае вы не можете использовать Class#getResource(String)
или Class#getResourceAsStream(String)
. Правила поиска ресурсов, связанных с данным классом, реализуются определяющим загрузчиком класса класса. Этот метод делегирует этот загрузчик класса объекта. Если этот объект был загружен загрузчиком класса bootstrap, этот метод делегирует ClassLoader.getSystemResourceAsStream(java.lang.String).
Перед делегированием по имени данного ресурса создается имя абсолютного ресурса с использованием этого алгоритма:
Если имя начинается с '/' ('\ u002f'), то абсолютное имя ресурса является частью имени, следующего за '/'.
В противном случае абсолютное имя имеет следующий вид:
modified_package_name/имя
Если имя modified_package_name является именем пакета этого объекта с заменой '/' на '.' ( '\ U002e').
Как правило, не очень сложно жестко указывать системное расположение ваших ресурсов в вашем коде. Чистый и чистый способ состоит в том, чтобы поместить ваши ресурсы в ваш путь к классам и получить к ним доступ. Надеюсь, это пояснит, почему он не работает.
Ответ 4
//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();
}
Ответ 5
Чтобы найти изображение Ширина, высота и размер
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();
}