java ico_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 getICOImageByUrl(String surl) {
HttpURLConnection httpURLConnection = null;
List 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这样一个list集合,获取最后一张,并实现转换。
List icoImages = getICOImageByUrl(url);
// 取最后一张最清晰的图片出来
ICOImage icoImage = icoImages.get(icoImages.size() - 1);
// 处理图片(转换大小,图片格式)并保存
hadleICOImage(icoImage);
java ico_Java图片处理:ico格式转 PNG/JPG等格式相关推荐
- Java 实现图片转换为ICO以及多种格式图片之间转换
详细信息请访问我的GitHub网站:https://github.com/HuBoZhi/image4j
- java图片ico_原创 | Java图片处理:ico格式转 PNG/JPG等格式
一. 什么是ico图标? ico是一种图标格式,大量应用于网站,各个软件的logo或图标展示. 我们在进入某个网站或网页,它们上方标题左侧各自都带有logo图标. 这就是favicon.ico图标,它 ...
- java图片格式转化(例如jpg格式转化png)
转载自 java图片格式转化(例如jpg格式转化png) import java.awt.image.BufferedImage; import java.io.File; import java. ...
- 图片转ICO工具新版本(支持更多图片格式,支持更多分辨率,原生更快)
纯Win32 API开发, 支持JPG.BMP.TIFF.ICO.PNG等所有常用格式 支持更多分辨率8x8, ... 1024x1024 支持原生图片尺寸大小 支持文件拖放打开 下载地址: htt ...
- 各种快捷的格式转换:图片转.ico,去图片白底
全部亲测是可以免费使用的,不用扫什么二维码,注册啥的 在线将各种格式的图片转换成.ico格式 http://www.faviconico.org/ 在线去图片的白色背景 http://www.aige ...
- C#实现把图片转换为ico格式
ico格式是我们常见的一种图标格式,曾经常常通过一些别的软件进行转换,现在研究了一下C#其实也可以进行转换. 网上很多方法是通过Bitmap直接获取句柄转为Icon对象并保存,这样得到的ico质量非常 ...
- win10 设置滑动关机以及修改图片为ico格式
设置滑动关机 之前看了一个视频,TOPBOOK : Win10 系统中,你可能不知道的五个小秘密.其中,滑动关机我觉得很有意思(有逼格). 设置很简单,在桌面创建一个快捷方式,弹出下面的界面. 输入下 ...
- jpg图片转ico图片格式
最近项目中需要做一个将用户头像转换成ico图标,以便转换成桌面图标的功能,我们的用户头像的图片全部是jpg格式的,所以,重点就是如何将jpg图片转换为ico图片了. 百度了一番后,找到了一个开源项目i ...
- 每日一搜:如何快速将图片转ico格式
每日一搜:如何快速将图片转ico格式 每日一搜:如何快速将图片转ico格式? ->>>>>解决方案: 点击链接打开以下网站,上传图片转为ICO格式:如下图所示
最新文章
- android 蓝牙 鼠标 app_Razer 雷蛇 那伽梵蛇 Pro 专业版 无线蓝牙鼠标 899元
- mysql远程连接数据库很慢
- 简说JAVA8引入函数式的问题
- SQL SERVER 2008权限配置
- windows python读取grib2数据
- Machine Learning week 7 quiz: Unsupervised Learning
- 超级计算机的电力消耗,适用超级计算机的一种优化供电方式
- JS获取html页面上选中内容
- 动态链接库 仅有.dll文件时候的使用方法
- 关于c++的一些案例
- hbase 使用lzo_带你快速上手HBase | HBase列族优化
- Java Swing Mysql实现的Ktv点歌系统项目源码附带视频运行教
- Mac安装Anaconda
- android抓包工具_无需额外工具,简单抓包教程
- 初生牛犊不怕虎之HTML初辨
- 极客战记计算机科学2村庄守卫,「网易官方」极客战记(codecombat)攻略-森林-村庄守护神-village-champion...
- 微信小程序vantweapp-Dialog弹出框提交表单,并还原确定按钮样式
- 项目经验之:针对昨日FDO连接SDF文件报错,国外GIS论坛给出了一个思路.帮助我过关.
- 什么样的软文发布会更容易被新闻媒体进行收录和转载?
- 基于Java的Minecraft游戏后端自定义插件 06绘制简单粒子特效与BukkitRunable定时器