一. 什么是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() {
try {
HttpsURLConnection
.setDefaultHostnameVerifier(new HostnameVerifier() {
public boolean verify(String hostname,
SSLSession session) {
return true;
}
});
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, new X509TrustManager[] { new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
} public void checkServerTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
} public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
} }, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(context
.getSocketFactory());
} catch (Exception e) {
e.printStackTrace();
}
}

3.2 java-image-scaling-0.8.6.jar 主要缩放,修改图片大小

由于ICO图标的像素大小(宽高)都比较小,再获取到图片后, 需要调整大小。如果采用普通方式去调整大小的话,图片会模糊,而且会出现类似马赛克的图像噪点。这样的效果并不理想。

下面的方法就是对ICO图片进行放大到80x80像素,在转换成PNG,并转换成base64,以便保存。

/**
* 处理ICOImage图片
*/
public static String hadleICOImage(ICOImage icoImage) throws IOException {
ResampleOp resampleOp = new ResampleOp(80,80);
resampleOp.setUnsharpenMask(AdvancedResizeOp.UnsharpenMask.Oversharpened);
BufferedImage bi = resampleOp.filter(icoImage.getImage(), null);
BufferedImage result = null;
/* 新生成结果图片 */
result = new BufferedImage(80, 80,
BufferedImage.TYPE_INT_RGB);
Graphics2D g = result.createGraphics();
g.setColor(Color.WHITE);
g.drawImage(bi.getScaledInstance(80,80, Image.SCALE_SMOOTH), 0, 0, null);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ImageIO.write(result, PNG, bos);
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(bos.toByteArray()).replaceAll("\n", "").replaceAll("\r", "").trim();
}

3.2 实现ICO转PNG

从调用getICOImageByUrl()获取List<ICOImage>这样一个list集合,获取最后一张,并实现转换。

List<ICOImage>  icoImages = getICOImageByUrl(url);
// 取最后一张最清晰的图片出来
ICOImage icoImage = icoImages.get(icoImages.size() - 1);
// 处理图片(转换大小,图片格式)并保存
hadleICOImage(icoImage);

Java图片处理:ico格式转 PNG/JPG等格式的更多相关文章

  1. Java图片缩略图裁剪水印缩放旋转压缩转格式-Thumbnailator图像处理

    前言 java开发中经常遇到对图片的处理,JDK中也提供了对应的工具类,不过处理起来很麻烦,Thumbnailator是一个优秀的图片处理的开源Java类库,处理效果远比Java API的好,从API ...

  2. simpleImageTool又纯java图片水印、缩放工具

    simpleImageTool又一个简单.好用的图片格式转换.缩放水印叠加等功能的纯Java图片工具库. simpleImageTool的由来,近期需要用到图片处理,通过网上的图片流直接进行缩放水印叠 ...

  3. Java 图片提取RGB数组 RGBOfCharMaps (整理)

    package demo; /** * Java 图片提取RGB数组 RGBOfCharMaps (整理) * 声明: * 和ImageCombining配合使用的工具,这里是提取图片的R.G.B生成 ...

  4. Java 图片转换为字符图 CharMaps (整理)

      /* * Java 图片转换成字符图 CharMaps (整理) * * 2016-1-2 深圳 南山平山村 曾剑锋 * * @(#)CharMaps.java 2014/1/16 * 1.这个一 ...

  5. Java 图片处理解决方案:ImageMagick 快速入门

    一.ImageMagick介绍 ImageMagick是一个免费的创建.编辑.合成图片的软件,可以实现图片切割.颜色替换.图片缩略图.图片水印等各种效果.ImageMagick是免费开源软件,支持大多 ...

  6. Java 图片处理解决方案:ImageMagick 快速入门教程

    文章首发于[博客园-陈树义],点击跳转到原文Java 图片处理解决方案:ImageMagick 快速入门教程. ImageMagick介绍 ImageMagick是一个免费的创建.编辑.合成图片的软件 ...

  7. Atitit.java图片图像处理attilax总结

    Atitit.java图片图像处理attilax总结 BufferedImage extends java.awt.Image 获取图像像素点 image.getRGB(i, lineIndex); ...

  8. Atitit.java图片图像处理attilax总结  BufferedImage extends java.awt.Image获取图像像素点image.getRGB(i, lineIndex); 图片剪辑/AtiPlatf_cms/src/com/attilax/img/imgx.javacutImage图片处理titit 判断判断一张图片是否包含另一张小图片 atitit 图片去噪算法的原理与

    Atitit.java图片图像处理attilax总结 BufferedImage extends java.awt.Image 获取图像像素点 image.getRGB(i, lineIndex); ...

  9. Java json设置时间格式,Jackson设置时间格式,json设置单引号

    Java json设置时间格式,Jackson设置时间格式,json设置单引号 >>>>>>>>>>>>>>> ...

随机推荐

  1. 微服务架构 - 网关 Spring Cloud Gateway

    Spring Cloud Gateway 工作原理 客户端向 Spring Cloud Gateway 发出请求,如果请求与网关程序定义的路由匹配,则将其发送到网关 Web 处理程序,此处理程序运行特 ...

  2. 【JVM从小白学成大佬】4.Java虚拟机何谓垃圾及垃圾回收算法

    在Java中内存是由虚拟机自动管理的,虚拟机在内存中划出一片区域,作为满足程序内存分配请求的空间.内存的创建仍然是由程序猿来显示指定的,但是对象的释放却对程序猿是透明的.就是解放了程序猿手动回收内存的 ...

  3. shell习题1

    1------->>>批量创建用户. $#  ---  统计传入参数的数量 $*  ---  传入若干个参数 使用id来确认用户是否存在并创建 向$*进行传参,在运行时加上需要添加的 ...

  4. 阿里分布式事务seata入门(采坑)

    1. 阿里分布式事务seata入门(采坑) 1.1. 前言 seata是feascar改名而来,这是阿里在19年年初开源出来的分布式事务框架,当初刚出来的时候就想研究下了,一直拖到了现在,目前是0.8 ...

  5. 给 asp.net core 写个中间件来记录接口耗时

    给 asp.net core 写个中间件来记录接口耗时 Intro 写接口的难免会遇到别人说接口比较慢,到底慢多少,一个接口服务器处理究竟花了多长时间,如果能有具体的数字来记录每个接口耗时多少,别人再 ...

  6. Delphi - cxGrid添加Footer显示

    cxGrid - 添加footer显示 1:添加Footer Items 单击cxGrid Customize... ,Summary,Add: 2:添加Footer items数据绑定 选中一条需要 ...

  7. Linux中安装PostgreSQL-10.1

    环境说明 Linux版本:CentOS Linux release 7.6.1810 (Core) PostgreSQL版本:PostgreSQL-10.1 PostgreSQL下载网址:https: ...

  8. 五大典型场景中的API自动化测试实践

    一.API 测试的基本步骤 通常来讲,API 测试的基本步骤主要包括以下三大步骤: 1.准备测试数据: 2.通过通用的或自己开发的API测试工具发起对被测API的request: 3.验证返回结果的r ...

  9. Python数据分析之Pandas读写外部数据文件

    1 引言 数据分析.数据挖掘.可视化是Python的众多强项之一,但无论是这几项中的哪一项都必须以数据作为基础,数据通常都存储在外部文件中,例如txt.csv.excel.数据库.本篇中,我们来捋一捋 ...

  10. txt 文件的归并和分割

    1.归并 import os # 1.获取需要整合的文件目录下的 filepath = "G:\\我的python\\尹成\\python基础\\day13\\详细分类\\详细地区" ...