17

我在使用 Java 应用程序时遇到问题,尤其是从我计算机中的某个位置加载图像时。

这篇文章之后,我使用 aBufferedImage和 aInputFileStream在我的计算机上加载图像。首先,我将图像 ( pic2.jpg) 放入源代码中,这样就可以了。但是,如果我将图像放到另一个地方(比如说C:\\ImageTest\pic2.jpg),Java IDE 会显示一个IllegalArgumentException

return ImageIO.read(in);

这是代码:

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.
            return ImageIO.read(in);
        } catch (IOException e) {
            System.out.println("The image was not loaded.");
            //System.exit(1);
        }

        return null;
    }
}
4

5 回答 5

23

要从非相对路径读取 .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 环境,所以希望它可以正常工作并正确编写。

于 2013-10-18T10:28:54.723 回答
8

getResource&getResourceAsStream不适用于文件路径,但路径相对于代码库。如果代码库是C:定位资源的相对路径,则为/ImageTest/pic2.jpg.

..加载文件的区别FileInputStreamgetResourceAsStream

一个主要区别是getResource..它将使用 Jar 中的资源,它不再是File. 因此FileInputStream 不能用于访问这样的资源。

于 2013-10-18T10:21:04.710 回答
4

在这种情况下,您不能使用Class#getResource(String)或。Class#getResourceAsStream(String)搜索与给定类关联的资源的规则由该类的定义类加载器实现。这个方法委托给这个对象的类加载器。如果此对象由引导类加载器加载,则该方法委托给ClassLoader.getSystemResourceAsStream(java.lang.String).

在委托之前,使用以下算法从给定的资源名称构造一个绝对资源名称:

如果名称以/( \u002f) 开头,则资源的绝对名称是名称中/. 否则,绝对名称的格式如下:modified_pa​​ckage_name/name

其中 modified_pa​​ckage_name 是此对象的包名称,/替换为.( \u002e)。

通常,在代码中硬编码资源的系统位置并不是一件好事。简洁明了的方法是将资源放在类路径中并访问它们。希望这可以澄清为什么它不起作用

于 2013-10-18T10:29:00.043 回答
1
//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();
}
于 2015-10-15T15:17:50.940 回答
-1

查找图像的宽度、高度和大小

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();
}
于 2017-08-23T14:54:02.777 回答