我正在尝试加载这个 image来自 URL,但收到类似 this 的图像.
代码:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
URL url = new URL("http://s.developers.org.ua/img/announces/java_1.jpg");
BufferedInputStream in = new BufferedInputStream(url.openStream());
byte[] b = new byte[512];
while (in.read(b)!=-1)
out.write(b);
Image img = ImageIO.read(new ByteArrayInputStream(out.toByteArray()));
g2.drawImage(img, 0, 0, getWidth(), getHeight(), null);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
最佳答案
不要在
paintComponent
方法中读取图像,这会使您的应用程序显得迟缓,因为该方法是在事件调度线程 (EDT) 上执行的。此外,每当您的组件重新绘制时,它都会被重新读取,这意味着您将一遍又一遍地下载图像。相反,预先阅读它,或者在一个单独的线程中(即使用SwingWorker
),并且只从内部调用
方法。g.drawImage(...)
>paintComponent图像损坏的原因是您的字节复制代码,您没有注意读取了多少字节(只要该值不是
-1
) ,而是无条件地复制512
字节。然而,你不需要在这里这样做,你可以简单地将流传递给ImageIO.read
,像这样,使代码更简单和更具可读性:URL url = new URL("http://s.developers.org.ua/img/announces/java_1.jpg"); try (BufferedInputStream in = new BufferedInputStream(url.openStream())) { BufferedImage img = ImageIO.read(in); }
添加额外的
try
(try-with-resources) block 确保您的流也正确关闭以避免资源泄漏。为了完整性,修复字节复制代码,正确的版本是:
// ... as above ... byte[] b = new byte[512]; int bytesRead; // Keep track of the number of bytes read into 'b' while ((bytesRead = in.read(b)) != -1) out.write(b, 0, bytesRead);
关于 java 。来自 URL 的损坏图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36691091/