美文网首页
Java 图片处理相关笔记

Java 图片处理相关笔记

作者: silencefun | 来源:发表于2018-05-23 16:23 被阅读72次

    1.图片压缩

    起因:工作安排需要,爬虫爬取了大量国外一些行业数据和图片几百G+。

    存储在阿里云存储不是很贵但是流量费太贵(当日可能被爬了),最高一日近500 Gb,每小时rmb10(才看见账单天真的以为那是10块钱一天,原来是一个小时)。

    考虑压缩一下图片:很多原图是5M网上乃至10MB的

    压缩使用thumbnailator:https://github.com/coobird/thumbnailator

    Thumbnails.of(in).scale(outputscale).outputQuality(outputQuality).toFile(outfile);
    

    基本一句话搞定。

    设计思路:遍历文件夹文件,把大于需要压缩的长度的文件执行压缩。

    使用递归的思想:readfile()

    File file = new File(fileDir);
        File[] files = file.listFiles();// 获取目录下的所有文件或文件夹
        if (files == null) {// 如果目录为空,直接退出
    
            throw new IOException();
    
        }
        // 遍历,目录下的所有文件
    
        for (File f : files) {
    
            if (f.exists() && f.isFile()) {
    
                if (f.length() > max) {
                    String fileName = f.getName();
                     
                      System.err.println("需要加入的文件" + fileName + "的大小是:" + f.length());// 字节数
                }
    
            } else if (f.isDirectory()) {
                System.err.println(f.getAbsolutePath());
                readFile(f.getAbsolutePath());
            }
        }
    

    问题:

    1. javax.imageio.IIOException: Unsupported Image Type

    查证之后解释 P过的图片保存为jpg格式时,默认的模式是CMYK模式

    CMYK?

    CMYK (CYAN-MAGENTA-YELLOW-BLACK INK): 青色 - 品红 - 黄色 - 黑色 RGB (RED-GREEN-BLUE) 红 - 绿 - 蓝 [CMYK模式]当阳光照射到一个物体上时,这个物体将吸收一部分光线,并将剩下的光线进行反射,反射的光线就是 们所看见的物体颜色。
    [RGB模式]是一种发光的色彩模式,你在一间黑暗的房间内仍然可以看见屏幕上的内容。

    解决办法:使用TwelveMonkeys:https://github.com/haraldk/TwelveMonkeys

    最开始只引用了一个jpeg的jar
    http://search.maven.org/remotecontent?filepath=com/twelvemonkeys/imageio/imageio-jpeg/3.3.2/imageio-jpeg-3.3.2.jar
    出现

    java.lang.ClassNotFoundException: com.twelvemonkeys.imageio.spi.ImageReade.....

    好吧仔细看了一下说明

    image.png

    [dependencies]

    英 [di'pendənsiz] 美 [di'pendənsiz]

    • n. 依赖性,相关性;管理

    所以把这几个jar包都加进去重试解决问题。

    2. 爬取下载图片 http response code :400

    浏览器可以打开,但是程序不能下载。
    直接使用图片地址get 请求 结果是返回:

    java.io.IOException: Server returned HTTP response code: 400 
    

    本来以为个别的但是经过日志统计 竟然有差不多1%,80W张有9000多条失败记录,尤其是一些整篇都是。

    image.png

    再仔细一看,失败的都是各种各样的奇形怪状的文字,想到了可能是字符集的问题?

    修改之,无效,

    再想想到可能是因为特殊字符在连接中的java转义有问题,最后尝试解决办法:

                 // 重新封裝 
    
            String fullimg = urlStr.substring(urlStr.lastIndexOf("/") + 1, urlStr.length());
            String fore = urlStr.substring(0, urlStr.lastIndexOf("/")+1);
    
            URL url = new URL(fore + java.net.URLEncoder.encode(fullimg));
            // 需要轉義 特殊字符
    
            Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 8087));
            // HttpURLConnection conn = (HttpURLConnection) url.openConnection(proxy);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    

    完美解决一部分问题:9000张又搞下来6000多张,开始解决新的问题:

    3.java 下载图片 Connect Reset

    但是浏览器可以直接打开,
    1.可能以为线程过多,线程池20个进行下载,更改为5无效。
    2.想着可能是“Content-Type”的原因,尝试后加上:

            conn.setRequestProperty("User-Agent", getusergent());
            conn.setRequestProperty("Content-Type", "application/jpeg;charset=UTF-8");
    

    3000多张图又完美解决掉2000多张。

    相关文章

      网友评论

          本文标题:Java 图片处理相关笔记

          本文链接:https://www.haomeiwen.com/subject/usbrjftx.html