png转icon java_原创 | 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类

857c50e9366c

上面标记的四个方法中, 返回的是为什么是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);

857c50e9366c

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值