Java 图片处理相关笔记

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 图片处理相关笔记)