首页 > JAVA抓取网页的图片到本地后显示错乱

JAVA抓取网页的图片到本地后显示错乱

我尝试从url获取图片然后保存到本地,但是图片显示不正常,而且貌似图片大小比原图会大了一点,这是为什么?

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

public class DownloadImage {
    public static void main(String[] args){
        BufferedReader bufferedReader = null;
        FileOutputStream fileOutputStream = null;
        URL imageUrl = null;
        String str = null;
        URLConnection urlConnection = null;
        InputStream urlInputStream = null;
        byte[] byteArray = new byte[1024]; 
        File imageFile = null;
        
        try {
            bufferedReader = new BufferedReader(new FileReader("resources/imageURL"));    //这个文件的内容是url地址
            while((str = bufferedReader.readLine()) != null){ 
                imageUrl = new URL(str);
                urlConnection = imageUrl.openConnection();    
                urlConnection.connect();        
                urlInputStream = urlConnection.getInputStream();
                imageFile = new File("resources/image/" + str.substring(str.lastIndexOf("/")+1));
                if(!imageFile.exists()) imageFile.createNewFile();
                fileOutputStream = new FileOutputStream(imageFile);
                while(urlInputStream.read(byteArray) != -1){    
                    fileOutputStream.write(byteArray);
                }
                fileOutputStream.close();
                urlInputStream.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                bufferedReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            System.out.println("Done!");
        }
    }
}


楼上解释了图片大小的问题,我来说一下可能导致你图片显示不正常的问题。

我看见你的buffer设置的长度是1024,那么会出现什么情况呢?假设一块图片是1028字节,第一次写入buffer是1024全写满,这时你把buffer写入文件是没问题的,但第二次时只读出4个字节,也就是剩下的1020个字节是上次的。可是你仍然把整个buffer都写进文件里,显然是不妥的。

试试将

while(urlInputStream.read(byteArray) != -1){    
    fileOutputStream.write(byteArray);
}

改成

 int ch = 0;
 while((ch = urlInputStream.read(byteArray)) != -1){    
    fileOutputStream.write(byteArray,0,ch);
 }

看看如何


网站在加载或显示这个图片的时候可能会对图片大小进行处理,所以不一定是原图的大小,你取到得图片才是真正的原图


byte[] byteArray = new byte[这个数字暂时改成大一点的试试,比一张图片稍大即可]

你说图片比原来图片大一点,你直接点图片url 右键另存为,然后跟你代码爬下来的比较一下看看。
如果不一样的话我觉得很可能是因为二进制没写好的问题。

【热门文章】
【热门文章】