JAVA来自URL的损坏图像

JAVA来自URL的损坏图像,java,swing,io,javax.imageio,Java,Swing,Io,Javax.imageio,我正试图从URL加载此文件,但收到类似的图像 代码: 我有一些从URL到本地的代码副本文件。。到目前为止,结果与实际来源相同。只是做一些修改也许可以帮助解决这个问题 import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.net.URL; import java.util.ArrayList; import org.apache.commons.io.Filename

我正试图从URL加载此文件,但收到类似的图像

代码:


我有一些从URL到本地的代码副本文件。。到目前为止,结果与实际来源相同。只是做一些修改也许可以帮助解决这个问题

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import org.apache.commons.io.FilenameUtils;
import javax.imageio.ImageIO;

public class ImagesUrlToImagesLocal {
    public ArrayList<String> getIt(ArrayList<String> urlFile)
    {
        ArrayList<String> strResult = new ArrayList<String>();
        Image imagesUrl = null;
        String baseName = null;
        String extension = null;
        File outputfile = null;
        try {
            for (int i = 0; i < urlFile.size(); i++)
            {
                URL url = new URL(urlFile.get(i));
                baseName = FilenameUtils.getBaseName(urlFile.get(i));
                extension = FilenameUtils.getExtension(urlFile.get(i));
                imagesUrl = ImageIO.read(url);
                BufferedImage image = (BufferedImage) imagesUrl;
                outputfile = new File("temp_images/" + baseName + "." + extension);
                ImageIO.write(image, extension, outputfile);
                strResult.add("temp_images/" + baseName + "." + extension);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return strResult;
    }
}
导入java.awt.Image;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.net.URL;
导入java.util.ArrayList;
导入org.apache.commons.io.FilenameUtils;
导入javax.imageio.imageio;
公共类ImagesUrlToImagesLocal{
公共ArrayList getIt(ArrayList urlFile)
{
ArrayList strResult=新的ArrayList();
图像imagesUrl=null;
字符串baseName=null;
字符串扩展名=null;
File outputfile=null;
试一试{
对于(int i=0;i
  • 不要读取
    paintComponent
    方法中的图像,因为该方法是在事件调度程序线程(EDT)上执行的,这会使应用程序显得迟缓。此外,每当您的组件被重新绘制时,它将被重新读取,这意味着您将反复下载图像。相反,请提前阅读,或在单独的线程中阅读(即使用
    SwingWorker
    ),并且仅从
    paintComponent
    方法内部调用
    g.drawImage(…)

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

  • 为完整起见,要修复字节复制代码,正确的版本应为:

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

  • 我不知道这是否是唯一的问题,但你可能写得比你得到的更多。 我建议您将编写代码更改为:

    int len;
    while ((len=in.read(b))!=-1)
        out.write(b, 0, len);
    
    否则,如果最后一个缓冲区的长度不是512字节,您将写入太多

    int len;
    while ((len=in.read(b))!=-1)
        out.write(b, 0, len);