Загрузить изображение из пути к файлу через 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();
    }