web-dev-qa-db-ja.com

BufferedImageを介してファイルパスから画像を読み込む

Javaアプリケーションに問題があります。特に、コンピューターの場所からイメージをロードする場合に問題があります。

次の この投稿 私はBufferedImageInputFileStreamを使用してコンピューターに画像をロードしました。最初に、ソースコードにイメージ(pic2.jpg)を配置しましたが、それは機能しています。ただし、画像を別の場所に置いた場合(たとえば、C:\\ImageTest\pic2.jpg)、Java =IDE show 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;
    }
}
10
Lup

getResourcegetResourceAsStreamはファイルパスでは機能しませんが、コードベースに関連するパスでは機能しません。コードベースがC:の場合、リソースを見つける相対パスは/ImageTest/pic2.jpgです。

.. FileInputStreamgetResourceAsStreamによるロードファイルの違い?

大きな違いの1つは、getResource..FileではなくなったJar内のリソースで動作することです。したがって、FileInputStreamcannotを使用して、このようなリソースにアクセスします。

5
Andrew Thompson

非相対パスから.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環境はありませんので、動作し、正しく記述されていることを願っています。

13
Tafari

この場合、Class#getResource(String)またはClass#getResourceAsStream(String)は使用できません。特定のクラスに関連付けられたリソースを検索するためのルールは、クラスの定義クラスローダーによって実装されます。このメソッドは、このオブジェクトのクラスローダーに委任します。このオブジェクトがbootstrapクラスローダーによってロードされた場合、メソッドはClassLoader.getSystemResourceAsStream(Java.lang.String)に委任します。

委任前に、このアルゴリズムを使用して、指定されたリソース名から絶対リソース名が構築されます。

名前が/\u002f)で始まる場合、リソースの絶対名は/に続く名前の部分です。それ以外の場合、絶対名は次の形式です:modified_pa​​ckage_name/name

Modified_pa​​ckage_nameは、/.)を\u002eに置き換えたこのオブジェクトのパッケージ名です。

一般に、コード内でリソースのシステムの場所をハードコードすることは良いことではありません。きちんとしたクリーンな方法は、リソースをクラスパスに入れてアクセスすることです。これがなぜ機能していないのかを明らかにすることを願っています

4
Keerthivasan
//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();
}
0
Charles

画像の幅、高さ、サイズを見つけるには

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();
}
0
Harjinder Banga