1. 程式人生 > >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
     */
    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格式

一. 什麼是ico圖示? ico是一種圖示格式,大量應用於網站,各個軟體的logo或圖示展示。 我們在進入某個網站或網頁,它們上方標題左側各自都帶有logo圖示。 這就是favicon.ico圖示,它可以讓瀏覽器的收藏夾中除顯示相應的標題外,還可以用圖示的方式區別不同的網站。 二. ico圖示的特點 一張ic

Dicompng,jpg,可處理壓縮影象

如下:     file傳入檔案全路徑     注意:這個處理不了壓縮圖(維度較高的,如果需要通用化的請閱覽到最後!!!!)     10.24這個引數:轉 1024*1024的圖,也可以自定義 import

java圖片處理,裁剪,合圖,比例縮放

現在 外面核心,圖片文章比較少,看了拷貝程式碼,而用不了,用相應jar包處理,很多等比例縮放, 達不到 想要的給予的期望:本工具類,是之前做微信印表機寫的 基於java自帶的類,基於rgb。 package com.zjpz.util; import java.awt

java 圖片處理類, PNG, JPG, 支援圓角, 比摳正方形圖

綜合網上刪除Alpha通道的內容, 修改出來的版本, 勉強算原創吧 注意點: 這裡所有方法都是不支援多執行緒的(因為ImageIO) [java] view plain copy print? /*  * 圖片處理類  */package image;  import com.sun.ima

Java PDFHTML、Word、圖片、SVG、XPS、 PDF/A格式檔案

這篇文章介紹如何在Java應用程式中將PDF轉換為HTML、Word、圖片、SVG、XPS、PDF/A等格式。 本文所使用的PDF元件: Free Spire.PDF for Java Free Spire.PDF for Java是一個免費Java PDF元件,支援建立PDF文件、

Java-圖片處理 GifJpg

gif圖轉jpg有兩種方式: 1、使用jimi包,jar包下載地址 http://pan.baidu.com/s/1geTT8t1 2、使用gif4j包,jar包下載地址 http://pan.baidu.com/s/1eRDGC8a 見程式碼 package utils

BMP GIF PNG JPG圖片格式的區別和適用情況

文件 形象 err 無損 替換 顯示 獲得 行合並 效果 作者:趙鑫鏈接:https://www.zhihu.com/question/20028452/answer/142593276來源:知乎著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。 本

Java異常處理

異常處理: 一:異常: 程式在執行過程中出現的不正常的現象 二:分類: 異常和錯誤的區別:宜昌市程式設計師能夠處理的情況,而錯誤一般是硬體,執行環境設計等原因導致的,程式設計師不能去處理的情況 執行時異常和編譯時異常的區別:一般來說,執行時異常為語義錯誤,而

java異常處理finally中不要return

參考牛人部落格:http://www.cnblogs.com/Fskjb/archive/2012/02/15/2353256.html public class Ex1 {     public static void main(String[] args) {   

Java異常處理給程式罩一層保險

文/沉默王二 人這一生,總會遇到一些不可預料的麻煩,這些麻煩可能會讓我們遭受沉重的打擊。為了減輕因此承受的負擔,我們就會買保險。 本著負責任的態度,我們程式設計師在寫程式碼的時候,都非常的嚴謹。但程式在執行的時候,往往會出現一些令人意想不到的錯誤,導致那些不被期望的事件發生,最終,程式沒有按照我們的預

java圖片處理類庫Thumbnails使用

1.pom.xml <!-- 圖片處理 --> <dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailator</artifactId&g

java異常處理OOM(記憶體溢位異常)

什麼是OOM? OOM,全稱“Out Of Memory”,翻譯成中文就是“記憶體用完了”,來源於java.lang.OutOfMemoryError。看下關於的官方說明: Thrown when the Java Virtual Machine cannot allocat

java影象處理灰度化,二值化,降噪,切割,裁剪,識別,找相似

前段時間做爬蟲,涉及到對圖片驗證碼的破解,這裡羅列一些常用的影象處理方法,都很簡單並沒用到什麼複雜的演算法,所以不涉及opencv,都是一些直接對rgb畫素點的操作,很簡單也很好理解,至於識別直接用的tesseract-ocr,也可以用svm。(ps:圖片的畫素值矩陣的原點在

js上傳圖片處理壓縮,旋轉校正圖片

隨著科技發展的浪潮,手機上的攝像機的畫素越來越高,成像的效果也越來越好。到現在一張手機拍攝的圖片在 2M 左右是很正常的。在實際的應用場景中經常需要使用者上傳圖片這樣的人機互動方式。為了提高使用者體驗,上傳圖片之前要進行壓縮。部分手機拍攝的圖片會帶有拍攝方向(如

java圖片處理---Javax.imageIO包的用法

Java中進行影象I/O(即讀圖片和寫圖片,不涉及到複雜影象處理)有三個方法: 1. Java Image I/O API,支援常見圖片,從Java 2 version 1.4.0開始就內建了。 主頁:http://java.sun.com/javase/6/docs/technotes/guides/

Java圖片處理---尺寸不變,大小壓縮

尺寸不變,大小壓縮 public static boolean compressPic(String srcFilePath, String descFilePath) throws IOException { File file = nu

java圖片處理——多張圖片合成一張Gif圖片並播放或Gif拆分成多張圖片

1 多張jpg圖合成gif動畫 /** * 把多張jpg圖片合成一張 * @param pic String[] 多個jpg檔名 包含路徑 * @param newPic String 生成的gif檔名 包含路徑 */ pr

java圖片處理(水印 縮放 補白)

1 package com.hmw.picMark; 2 3 import java.awt.AlphaComposite; 4 import java.awt.Color; 5 import java.awt.Font; 6 import jav

Qt之生成png/jpg/bmp格式圖片

一、問題描述:有時候需要把Qt繪製的一些圖形儲存為png/jpg/bmp格式的圖片,下面就根據自己寫的一個簡單的測試程式來講解一下Qt中儲存圖片的方法。本文主要講解使用Qpainter和QImage組合

Java異常處理給程序罩一層保險

代碼段 虛擬 err 過多 run on() 如果 提示 ted 人這一生,總會遇到一些不可預料的麻煩,這些麻煩可能會讓我們遭受沈重的打擊。為了減輕因此承受的負擔,我們就會買保險。 本著負責任的態度,我們程序員在寫代碼的時候,都非常的嚴謹。但程序在運行的時候,往往會出現一些