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 等格式相关推荐

  1. java ico_Java图片处理:ico格式转 PNG/JPG等格式

    一. 什么是ico图标? ico是一种图标格式,大量应用于网站,各个软件的logo或图标展示. 我们在进入某个网站或网页,它们上方标题左侧各自都带有logo图标. 这就是favicon.ico图标,它 ...

  2. java图片ico_原创 | Java图片处理:ico格式转 PNG/JPG等格式

    一. 什么是ico图标? ico是一种图标格式,大量应用于网站,各个软件的logo或图标展示. 我们在进入某个网站或网页,它们上方标题左侧各自都带有logo图标. 这就是favicon.ico图标,它 ...

  3. thinkphp图片加载_标题栏ico展示

    在thinkphp中,一切涉及到链接和跳转的地方,都会按统一的格式http://hostname/index.php/modoule/controller/method这样的方法来访问. 比如在一个h ...

  4. Winform 将Ico图标转换为PNG图片

    不管是做web,还是做C/S,经常会用到各种各样的功能按钮图片.然而有的时候控件要求图片格式为Ico,有时候要求是jpg.png.gif等.再加上网上的精美图标资源很多,图标的尺寸都比较统一等等因素, ...

  5. 将.webp、.avif、.ico格式的图片转换为png图片的方法

    将.webp..avif..ico这些格式的图片转换为png图片,可以使用这个工具,工具链接如下: Web工具链接,网页打开直接可用 使用步骤 1. 将图片文件拖入窗口,或者点击如下图示区域: 打开对 ...

  6. 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(旋转时 ...

  7. Atitit java 二维码识别 图片识别

    Atitit java 二维码识别 图片识别 1.1. 解码1 1.2. 首先,我们先说一下二维码一共有40个尺寸.官方叫版本Version.1 1.3. 二维码的样例:2 1.4. 定位图案2 1. ...

  8. java 图片处理 图片缩略图,java怎么生成图片缩略图,缩小图片,高清图片缩小

    java如何生成图片缩略图,缩小图片,高清图片缩小 可以把图片缩小到理想的倍数,也可以根据自己的需要来具体规定图片转化后的大小 对于类型为jpg的图片来说,只需要三个参数就能转化得到自己想要的图片 参 ...

  9. java servlet 返回图片_SpringMVC返回图片的几种方式

    SpringMVC返回图片的几种方式 后端提供服务,通常返回的json串,但是某些场景下可能需要直接返回二进制流,如一个图片编辑接口,希望直接将图片流返回给前端,此时可以怎么处理? I. 返回二进制图 ...

  10. Java基于百度API的图片文字识别(支持中文,英文和中英文混合)

    点击上方"好好学java",选择"置顶公众号" 优秀学习资源.干货第一时间送达! 精彩内容 java实战练习项目教程 2018微服务资源springboot.s ...

最新文章

  1. application
  2. 使用Gearman做分布式计算
  3. pyton BeautifulSoup中文API
  4. iPhone流量偷跑探秘
  5. redis5种数据结构讲解及使用场景
  6. android 选座,机票在线选座 Android 开源库
  7. foriegn web site
  8. GDOI2021划水记
  9. WEB页面性能指标与建议
  10. CentOS系统使用yum安装配置MariaDB数据库
  11. log4j 配置文件路径问题
  12. JavaScript 关灯游戏
  13. 8张图学习大型网站技术架构(转)
  14. 泛微oa系统服务器怎么填写,泛微协同办公平台Ecology8安装部署手册(105页)-原创力文档...
  15. pantum打印机驱动安装m6506_奔图m6506驱动下载|
  16. ChromeOS+Win双系统安装教程
  17. xlwings 安装及排错: DLL load failed while importing win32api
  18. linux内核2.6.3x--Network device support
  19. 软件测试用例——三角形
  20. Java、JSP个人日程管理系统

热门文章

  1. QQ互联官网使用跳坑
  2. Python:第三方模块phonenumbers 解析全球电话号码
  3. 芯片工程师常用英文黑话
  4. 计算机英语CMYK全称,CMYK是什么意思 CMYK与RGB的区别介绍
  5. 2020年全球及中国电源管理芯片(PMIC)行业发展现状及市场竞争格局分析,全球市场集中,德州仪器市占第一「图」
  6. hdoj1299 还是A+B
  7. Excel 数据透视表教程大全之 01 什么是数据透视表 如何创建数据透视表
  8. 计算机辅助 教学方案,计算机辅助设计教学.doc
  9. 手游模拟器征途辅助脚本开发
  10. SWUST OJ 492: The Dutch flag problem