Java图片处理:ico格式转 PNG/JPG等格式
一. 什么是ico图标?
ico
是一种图标格式,大量应用于网站,各个软件的logo或图标展示。
我们在进入某个网站或网页,它们上方标题左侧各自都带有logo图标。
这就是favicon.ico
图标,它可以让浏览器的收藏夹中除显示相应的标题外,还可以用图标的方式区别不同的网站。
二. ico图标的特点
一张ico图标里,有可能只有一张或包含多张的图片信息,图片的清晰度越来越高。
三. 用Java来处理ico, 并转换成其他格式图片
做这种ico格式的图片转换功能,并不是特别容易,是有区别于普通图片格式转换,我经过不断尝试,调试,得到了一个自己还比较满意的结果。
我们在看代码之前,还是先看看我自己对这个功能的需求理解:
-
i. 需要有工具类能够读取ico的图片流。
-
ii. 对ico进行放大操作,尽可能地解决图片因为放大而出现模糊及毛刺。
-
iii. 能够将ico图片转换成其他格式的图片保存。
为了实现以上的3点功能,我需要借助这三个优秀的jar来实现此功能:
image4j.jar
主要读取ico图片java-image-scaling-0.8.6.jar
主要缩放,修改图片大小filters-2.0.235-1.jar
是image-scaling的依赖包
3.1 image4j.jar 主要读取ico图片
JDK没有提供读取ico图片的相关工具类,所以我们需要先解决读取ico格式的图片问题。
这里我找了相关的jar, 经过测试,image4j.jar中能读取。
image4j.jar
中涉及的主要类:ICODecoder
类
上面标记的四个方法中, 返回的是为什么是List集合?这里回到ICO的特点中来说,一张ICO图片包含一张或多张图片信息(取到图片后,看到图片主要是清晰度不同)
下面我是从发送http请求,从响应的图片流解析ICO图片
/** * 获取ICO图片 * @param surl * @return */ public static List<ICOImage> getICOImageByUrl(String surl) { HttpURLConnection httpURLConnection = null; List<ICOImage> list = new ArrayList<>(); try { URL url = new URL(surl); // https证书 checkQuietly(); httpURLConnection = (HttpURLConnection) url.openConnection(); httpURLConnection.setInstanceFollowRedirects(false); httpURLConnection.setRequestMethod("GET"); httpURLConnection.setConnectTimeout(30000); httpURLConnection.setReadTimeout(30000); httpURLConnection.setDoOutput(true); httpURLConnection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"); httpURLConnection.setRequestProperty("Charset", "UTF-8"); httpURLConnection.setRequestProperty("Accept", "*/*"); httpURLConnection.setRequestProperty("content-type","image/x-icon"); // 创建连接 httpURLConnection.connect(); if (httpURLConnection.getResponseCode() == 200) { InputStream in = httpURLConnection.getInputStream(); list = ICODecoder.readExt(in); // 从响应结果集中获取ico图片流 return list; } }catch (Exception e) { e.printStackTrace(); }finally { if(httpURLConnection != null){ httpURLConnection.disconnect(); } } return list; } /** * 配置https证书 */ public static void checkQuietly