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());
}
}
问题:
- 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多张。