Javaアプリケーションに問題があります。特に、コンピューターの場所からイメージをロードする場合に問題があります。
次の この投稿 私はBufferedImage
とInputFileStream
を使用してコンピューターに画像をロードしました。最初に、ソースコードにイメージ(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;
}
}
getResource
&getResourceAsStream
はファイルパスでは機能しませんが、コードベースに関連するパスでは機能しません。コードベースがC:
の場合、リソースを見つける相対パスは/ImageTest/pic2.jpg
です。
..
FileInputStream
とgetResourceAsStream
によるロードファイルの違い?
大きな違いの1つは、getResource..
がFile
ではなくなったJar内のリソースで動作することです。したがって、FileInputStream
cannotを使用して、このようなリソースにアクセスします。
非相対パスから.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環境はありませんので、動作し、正しく記述されていることを願っています。
この場合、Class#getResource(String)
またはClass#getResourceAsStream(String)
は使用できません。特定のクラスに関連付けられたリソースを検索するためのルールは、クラスの定義クラスローダーによって実装されます。このメソッドは、このオブジェクトのクラスローダーに委任します。このオブジェクトがbootstrapクラスローダーによってロードされた場合、メソッドはClassLoader.getSystemResourceAsStream(Java.lang.String)
に委任します。
委任前に、このアルゴリズムを使用して、指定されたリソース名から絶対リソース名が構築されます。
名前が/
(\u002f
)で始まる場合、リソースの絶対名は/
に続く名前の部分です。それ以外の場合、絶対名は次の形式です:modified_package_name/name
Modified_package_nameは、/
(.
)を\u002e
に置き換えたこのオブジェクトのパッケージ名です。
一般に、コード内でリソースのシステムの場所をハードコードすることは良いことではありません。きちんとしたクリーンな方法は、リソースをクラスパスに入れてアクセスすることです。これがなぜ機能していないのかを明らかにすることを願っています
//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();
}
画像の幅、高さ、サイズを見つけるには
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();
}