java ico图片转png_Java 图片处理: ico 格式转 PNG/JPG 等格式
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
*/
publicstaticListgetICOImageByUrl(Stringsurl){
HttpURLConnectionhttpURLConnection=null;
Listlist=newArrayList<>();
try{
URL url=newURL(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){
InputStreamin=httpURLConnection.getInputStream();
list=ICODecoder.readExt(in);// 从响应结果集中获取 ico 图片流
returnlist;
}
}catch(Exceptione){
e.printStackTrace();
}finally{
if(httpURLConnection!=null){
httpURLConnection.disconnect();
}
}
returnlist;
}
/**
* 配置 https 证书
*/
publicstaticvoidcheckQuietly(){
try{
HttpsURLConnection
.setDefaultHostnameVerifier(newHostnameVerifier(){
publicbooleanverify(Stringhostname,
SSLSessionsession){
returntrue;
}
});
SSLContextcontext=SSLContext.getInstance("TLS");
context.init(null,newX509TrustManager[]{newX509TrustManager(){
publicvoidcheckClientTrusted(X509Certificate[]chain,
StringauthType)throwsCertificateException{
}
publicvoidcheckServerTrusted(X509Certificate[]chain,
StringauthType)throwsCertificateException{
}
publicX509Certificate[]getAcceptedIssuers(){
returnnewX509Certificate[0];
}
}},newSecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(context
.getSocketFactory());
}catch(Exceptione){
e.printStackTrace();
}
}
3.2 java-image-scaling-0.8.6.jar 主要缩放, 修改图片大小
由于 ICO 图标的像素大小 (宽高) 都比较小, 再获取到图片后, 需要调整大小. 如果采用普通方式去调整大小的话, 图片会模糊, 而且会出现类似马赛克的图像噪点. 这样的效果并不理想.
下面的方法就是对 ICO 图片进行放大到 80x80 像素, 在转换成 PNG, 并转换成 base64, 以便保存./**
* 处理 ICOImage 图片
*/
publicstaticStringhadleICOImage(ICOImageicoImage)throwsIOException{
ResampleOpresampleOp=newResampleOp(80,80);
resampleOp.setUnsharpenMask(AdvancedResizeOp.UnsharpenMask.Oversharpened);
BufferedImagebi=resampleOp.filter(icoImage.getImage(),null);
BufferedImageresult=null;
/* 新生成结果图片 */
result=newBufferedImage(80,80,
BufferedImage.TYPE_INT_RGB);
Graphics2Dg=result.createGraphics();
g.setColor(Color.WHITE);
g.drawImage(bi.getScaledInstance(80,80,Image.SCALE_SMOOTH),0,0,null);
ByteArrayOutputStreambos=newByteArrayOutputStream();
ImageIO.write(result,PNG,bos);
BASE64Encoder encoder=newBASE64Encoder();
returnencoder.encode(bos.toByteArray()).replaceAll("\n","").replaceAll("\r","").trim();
}
3.2 实现 ICO 转 PNG
从调用 getICOImageByUrl()获取 List 这样一个 list 集合, 获取最后一张, 并实现转换.ListicoImages=getICOImageByUrl(url);
// 取最后一张最清晰的图片出来
ICOImageicoImage=icoImages.get(icoImages.size()-1);
// 处理图片 (转换大小, 图片格式) 并保存
hadleICOImage(icoImage);
来源: https://www.cnblogs.com/werewolfBoy/p/11590525.html
java ico图片转png_Java 图片处理: ico 格式转 PNG/JPG 等格式相关推荐
- java ico_Java图片处理:ico格式转 PNG/JPG等格式
一. 什么是ico图标? ico是一种图标格式,大量应用于网站,各个软件的logo或图标展示. 我们在进入某个网站或网页,它们上方标题左侧各自都带有logo图标. 这就是favicon.ico图标,它 ...
- java图片ico_原创 | Java图片处理:ico格式转 PNG/JPG等格式
一. 什么是ico图标? ico是一种图标格式,大量应用于网站,各个软件的logo或图标展示. 我们在进入某个网站或网页,它们上方标题左侧各自都带有logo图标. 这就是favicon.ico图标,它 ...
- thinkphp图片加载_标题栏ico展示
在thinkphp中,一切涉及到链接和跳转的地方,都会按统一的格式http://hostname/index.php/modoule/controller/method这样的方法来访问. 比如在一个h ...
- Winform 将Ico图标转换为PNG图片
不管是做web,还是做C/S,经常会用到各种各样的功能按钮图片.然而有的时候控件要求图片格式为Ico,有时候要求是jpg.png.gif等.再加上网上的精美图标资源很多,图标的尺寸都比较统一等等因素, ...
- 将.webp、.avif、.ico格式的图片转换为png图片的方法
将.webp..avif..ico这些格式的图片转换为png图片,可以使用这个工具,工具链接如下: Web工具链接,网页打开直接可用 使用步骤 1. 将图片文件拖入窗口,或者点击如下图示区域: 打开对 ...
- Java之~ 上传 图片压缩,阿里图片压缩,图片旋转方法工具类
需要的jar jai_codec-1.1.3.jar,jai_core-1.1.3.jar,simpleimage-1.2.0.jar,metadata-extractor-2.3.1.jar(旋转时 ...
- Atitit java 二维码识别 图片识别
Atitit java 二维码识别 图片识别 1.1. 解码1 1.2. 首先,我们先说一下二维码一共有40个尺寸.官方叫版本Version.1 1.3. 二维码的样例:2 1.4. 定位图案2 1. ...
- java 图片处理 图片缩略图,java怎么生成图片缩略图,缩小图片,高清图片缩小
java如何生成图片缩略图,缩小图片,高清图片缩小 可以把图片缩小到理想的倍数,也可以根据自己的需要来具体规定图片转化后的大小 对于类型为jpg的图片来说,只需要三个参数就能转化得到自己想要的图片 参 ...
- java servlet 返回图片_SpringMVC返回图片的几种方式
SpringMVC返回图片的几种方式 后端提供服务,通常返回的json串,但是某些场景下可能需要直接返回二进制流,如一个图片编辑接口,希望直接将图片流返回给前端,此时可以怎么处理? I. 返回二进制图 ...
- Java基于百度API的图片文字识别(支持中文,英文和中英文混合)
点击上方"好好学java",选择"置顶公众号" 优秀学习资源.干货第一时间送达! 精彩内容 java实战练习项目教程 2018微服务资源springboot.s ...
最新文章
- application
- 使用Gearman做分布式计算
- pyton BeautifulSoup中文API
- iPhone流量偷跑探秘
- redis5种数据结构讲解及使用场景
- android 选座,机票在线选座 Android 开源库
- foriegn web site
- GDOI2021划水记
- WEB页面性能指标与建议
- CentOS系统使用yum安装配置MariaDB数据库
- log4j 配置文件路径问题
- JavaScript 关灯游戏
- 8张图学习大型网站技术架构(转)
- 泛微oa系统服务器怎么填写,泛微协同办公平台Ecology8安装部署手册(105页)-原创力文档...
- pantum打印机驱动安装m6506_奔图m6506驱动下载|
- ChromeOS+Win双系统安装教程
- xlwings 安装及排错: DLL load failed while importing win32api
- linux内核2.6.3x--Network device support
- 软件测试用例——三角形
- Java、JSP个人日程管理系统
热门文章
- QQ互联官网使用跳坑
- Python:第三方模块phonenumbers 解析全球电话号码
- 芯片工程师常用英文黑话
- 计算机英语CMYK全称,CMYK是什么意思 CMYK与RGB的区别介绍
- 2020年全球及中国电源管理芯片(PMIC)行业发展现状及市场竞争格局分析,全球市场集中,德州仪器市占第一「图」
- hdoj1299 还是A+B
- Excel 数据透视表教程大全之 01 什么是数据透视表 如何创建数据透视表
- 计算机辅助 教学方案,计算机辅助设计教学.doc
- 手游模拟器征途辅助脚本开发
- SWUST OJ 492: The Dutch flag problem