![](/img/trans.png)
[英]Exception while reading image ==java.lang.IllegalArgumentException: image == null
[英]Exception "java.lang.IllegalArgumentException: image == null!" in ImageIO
我正在嘗試從字節數組中寫入一個png
文件。
我的應用程序拋出以下異常"java.lang.IllegalArgumentException: image == null!" in ImageIO
"java.lang.IllegalArgumentException: image == null!" in ImageIO
我使用隨機字節數組測試了我的解決方案,如下面的代碼片段所示,但仍然拋出異常。
你能幫我找出為什么它會被拋出嗎?
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
public class Main {
public static void main(String[] args) throws IOException {
String fn = new String("C:\\Users\\frogwine\\Desktop\\P1.png");
byte [] data = new byte[256];
Random r = new Random();
r.nextBytes(data);
ByteArrayInputStream bis = new ByteArrayInputStream(data);
ByteArrayInputStream input_stream= new ByteArrayInputStream(data);
BufferedImage final_buffered_image = ImageIO.read(input_stream);
ImageIO.write(final_buffered_image , "png", new File(fn) );
}
}
堆棧跟蹤:
"C:\Program Files\Java\jdk-13.0.1\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2019.3\lib\idea_rt.jar=57315:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2019.3\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\frogwine\Documents\deneme\out\production\deneme com.berk.Main
Exception in thread "main" java.lang.IllegalArgumentException: image == null!
at java.desktop/javax.imageio.ImageTypeSpecifier.createFromRenderedImage(ImageTypeSpecifier.java:925)
at java.desktop/javax.imageio.ImageIO.getWriter(ImageIO.java:1608)
at java.desktop/javax.imageio.ImageIO.write(ImageIO.java:1540)
at com.berk.Main.main(Main.java:23)
Process finished with exit code 1
嗯,這並不奇怪。 從ImageIO.read文檔:
如果沒有注冊的 ImageReader 聲稱能夠讀取結果流,則返回 null。
將隨機字節寫入數組不會以任何格式創建有效的圖像數據,因為圖像格式具有標准結構,該結構至少由標題組成。 因此, ImageIO.read
返回 null。
正如 Leo 還提到僅將隨機字節傳遞給 ImageIO.read 方法,您無法獲得隨機圖像。 您將獲得空圖像,當您將其傳遞給 write 方法時,它將拋出此 IllegalArgumentException。
相反,您可以創建具有預定義寬度和高度的空圖像並設置 RGB 顏色值以獲得如下隨機圖像。
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
public class Main {
public static void main(String[] args) throws IOException {
String fn = new String("C:\\Users\\frogwine\\Desktop\\P1.png");
ImageIO.write(generateRandomImage(300) , "png", new File(fn) );
}
public static BufferedImage generateRandomImage(int numOfPixels) {
final double ASPECT_RATIO = 4.0 / 3.0;
int width = 0;
int height = 0;
byte[] rgbValue = new byte[3];
BufferedImage image = null;
SecureRandom random = null;
try {
random = SecureRandom.getInstance("SHA1PRNG");
width = (int) Math.ceil(Math.sqrt(numOfPixels * ASPECT_RATIO));
height = (int) Math.ceil(numOfPixels / (double) width);
image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
random.nextBytes(rgbValue);
image.setRGB(x, y,
byteToInt(rgbValue[0]) + (byteToInt(rgbValue[1]) << 8) + (byteToInt(rgbValue[2]) << 16));
}
}
return image;
} catch (NoSuchAlgorithmException nsaEx) {
nsaEx.printStackTrace();
}
return null;
}
public static int byteToInt(int b) {
int i = b;
if (i < 0) {
i = i + 256;
}
return i;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.