java 。来自 URL 的损坏图片

标签 java swing io javax.imageio

我正在尝试加载这个 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();
            }

最佳答案

  1. 不要在 paintComponent 方法中读取图像,这会使您的应用程序显得迟缓,因为该方法是在事件调度线程 (EDT) 上执行的。此外,每当您的组件重新绘制时,它都会被重新读取,这意味着您将一遍又一遍地下载图像。相反,预先阅读它,或者在一个单独的线程中(即使用 SwingWorker),并且只从 内部调用 g.drawImage(...) >paintComponent 方法。

  2. 图像损坏的原因是您的字节复制代码,您没有注意读取了多少字节(只要该值不是-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 确保您的流也正确关闭以避免资源泄漏。

  3. 为了完整性,修复字节复制代码,正确的版本是:

    // ... 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/

相关文章:

java - 在java 8中将拖动的组件添加到JPanel

Java 7 - 通过类层次结构流式传输数据

java - 将输入拆分为 vector

java - 如何在 JFrame 打开时附加进度条?

Java:弹出窗口并不总是可见

java - org.graphstream.algorithm.APSP$APSPInfo.getShortestPathTo 处的 NullPointerException - 图形问题

java - 从保持 Activity 状态的 JButton 进程中关闭 JFrame

c++ - fstream 替换文件的一部分

java - 什么是 Maven Artifact ?

使用 Jackson 将 Java 属性文件转换为 JSON