Java 圖片處理相關(guān)筆記

1.圖片壓縮

起因:工作安排需要,爬蟲爬取了大量國外一些行業(yè)數(shù)據(jù)和圖片幾百G+。

存儲在阿里云存儲不是很貴但是流量費(fèi)太貴(當(dāng)日可能被爬了),最高一日近500 Gb,每小時rmb10(才看見賬單天真的以為那是10塊錢一天,原來是一個小時)。

考慮壓縮一下圖片:很多原圖是5M網(wǎng)上乃至10MB的

壓縮使用thumbnailator:https://github.com/coobird/thumbnailator

Thumbnails.of(in).scale(outputscale).outputQuality(outputQuality).toFile(outfile);

基本一句話搞定。

設(shè)計(jì)思路:遍歷文件夾文件,把大于需要壓縮的長度的文件執(zhí)行壓縮。

使用遞歸的思想:readfile()

File file = new File(fileDir);
    File[] files = file.listFiles();// 獲取目錄下的所有文件或文件夾
    if (files == null) {// 如果目錄為空,直接退出

        throw new IOException();

    }
    // 遍歷,目錄下的所有文件

    for (File f : files) {

        if (f.exists() && f.isFile()) {

            if (f.length() > max) {
                String fileName = f.getName();
                 
                  System.err.println("需要加入的文件" + fileName + "的大小是:" + f.length());// 字節(jié)數(shù)
            }

        } else if (f.isDirectory()) {
            System.err.println(f.getAbsolutePath());
            readFile(f.getAbsolutePath());
        }
    }

問題:

  1. javax.imageio.IIOException: Unsupported Image Type

查證之后解釋 P過的圖片保存為jpg格式時,默認(rèn)的模式是CMYK模式

CMYK?

CMYK (CYAN-MAGENTA-YELLOW-BLACK INK): 青色 - 品紅 - 黃色 - 黑色 RGB (RED-GREEN-BLUE) 紅 - 綠 - 藍(lán) [CMYK模式]當(dāng)陽光照射到一個物體上時,這個物體將吸收一部分光線,并將剩下的光線進(jìn)行反射,反射的光線就是 們所看見的物體顏色。
[RGB模式]是一種發(fā)光的色彩模式,你在一間黑暗的房間內(nèi)仍然可以看見屏幕上的內(nèi)容。

解決辦法:使用TwelveMonkeys:https://github.com/haraldk/TwelveMonkeys

最開始只引用了一個jpeg的jar
http://search.maven.org/remotecontent?filepath=com/twelvemonkeys/imageio/imageio-jpeg/3.3.2/imageio-jpeg-3.3.2.jar
出現(xiàn)

java.lang.ClassNotFoundException: com.twelvemonkeys.imageio.spi.ImageReade.....

好吧仔細(xì)看了一下說明

image.png

[dependencies]

英 [di'pend?nsiz] 美 [di'pend?nsiz]

  • n. 依賴性,相關(guān)性;管理

所以把這幾個jar包都加進(jìn)去重試解決問題。

2. 爬取下載圖片 http response code :400

瀏覽器可以打開,但是程序不能下載。
直接使用圖片地址get 請求 結(jié)果是返回:

java.io.IOException: Server returned HTTP response code: 400 

本來以為個別的但是經(jīng)過日志統(tǒng)計(jì) 竟然有差不多1%,80W張有9000多條失敗記錄,尤其是一些整篇都是。

image.png

再仔細(xì)一看,失敗的都是各種各樣的奇形怪狀的文字,想到了可能是字符集的問題?

修改之,無效,

再想想到可能是因?yàn)樘厥庾址谶B接中的java轉(zhuǎn)義有問題,最后嘗試解決辦法:

             // 重新封裝 

        String fullimg = urlStr.substring(urlStr.lastIndexOf("/") + 1, urlStr.length());
        String fore = urlStr.substring(0, urlStr.lastIndexOf("/")+1);

        URL url = new URL(fore + java.net.URLEncoder.encode(fullimg));
        // 需要轉(zhuǎn)義 特殊字符

        Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 8087));
        // HttpURLConnection conn = (HttpURLConnection) url.openConnection(proxy);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

完美解決一部分問題:9000張又搞下來6000多張,開始解決新的問題:

3.java 下載圖片 Connect Reset

但是瀏覽器可以直接打開,
1.可能以為線程過多,線程池20個進(jìn)行下載,更改為5無效。
2.想著可能是“Content-Type”的原因,嘗試后加上:

        conn.setRequestProperty("User-Agent", getusergent());
        conn.setRequestProperty("Content-Type", "application/jpeg;charset=UTF-8");

3000多張圖又完美解決掉2000多張。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容