2018-03-01 thumbnailator圖片處理接收Byte數(shù)組

thumbnailator工具以及Java原生的圖片處理工具類,效率上還是原生的較好钓猬,不過(guò)thumbnailator提供的功能較全面也較簡(jiǎn)單稍刀,需要注意的是thumbnailator處理png格式的圖片時(shí),如果遇到透明背景的話敞曹,會(huì)處理成黑色的背景账月,處理方法就是在使用thumbnailator處理png圖像之前將其背景圖設(shè)置為白色,這是最簡(jiǎn)單有效的辦法异雁,各位看官如果有其他行之有效的方法捶障,歡迎隨時(shí)留言

package com.*.util;  
  
import java.awt.Color;  
import java.awt.Graphics2D;  
import java.awt.Rectangle;  
import java.awt.image.BufferedImage;  
import java.io.ByteArrayInputStream;  
import java.io.ByteArrayOutputStream;  
import java.io.IOException;  
import java.io.InputStream;  
import java.util.Iterator;  
  
import javax.imageio.ImageIO;  
import javax.imageio.ImageReadParam;  
import javax.imageio.ImageReader;  
import javax.imageio.stream.ImageInputStream;  
  
import net.coobird.thumbnailator.Thumbnailator;  
import net.coobird.thumbnailator.Thumbnails;  
import net.coobird.thumbnailator.geometry.Positions;  
  
public class ImageUtils  
{  
  
      
    /** 
     * jpg文件格式 
     */  
    public static String JPG = "jpg";  
      
    /** 
     * png文件格式 
     */  
    public static String PNG = "png";  
      
    /** 
     * 圖片裁剪工具 
     *  
     * @param in 
     *            ******************輸入流 
     * @param readImageFormat 
     *            *****圖片格式 
     * @param x 
     *            *******************起始點(diǎn)x坐標(biāo) 
     * @param y 
     *            *******************起始點(diǎn)y坐標(biāo) 
     * @param w 
     *            *******************裁剪寬度 
     * @param h 
     *            *******************裁剪高度 
     * @return is*****************輸出流 
     * @author Jieve 
     * @throws IOException 
     */  
    public static InputStream cutImage(InputStream in, String readImageFormat, int x, int y, int w, int h) throws IOException  
    {  
  
        Iterator<ImageReader> iterator = ImageIO.getImageReadersByFormatName(readImageFormat);  
        ImageReader reader = (ImageReader) iterator.next();  
        ImageInputStream iis = ImageIO.createImageInputStream(in);  
        reader.setInput(iis, true);  
        ImageReadParam param = reader.getDefaultReadParam();  
        Rectangle rect = new Rectangle(x, y, w, h);  
        param.setSourceRegion(rect);  
        BufferedImage bi = reader.read(0, param);  
        ByteArrayOutputStream os = new ByteArrayOutputStream();  
        ImageIO.write(bi, readImageFormat, os);  
        InputStream is = new ByteArrayInputStream(os.toByteArray());  
        in.close();  
        os.close();  
        return is;  
    }  
  
    /** 
     * 根據(jù)圖片對(duì)象獲取對(duì)應(yīng)InputStream 
     *  
     * @param image 
     * @param readImageFormat 
     * @return 
     * @throws IOException 
     */  
    public static InputStream getInputStream(BufferedImage image, String readImageFormat) throws IOException  
    {  
  
        ByteArrayOutputStream os = new ByteArrayOutputStream();  
        ImageIO.write(image, readImageFormat, os);  
        InputStream is = new ByteArrayInputStream(os.toByteArray());  
        os.close();  
        return is;  
    }  
      
    /** 
     * 生成縮略圖 
     *  
     * @param in 
     * @param size 
     * @param imageFormat 
     * @return 
     * @throws IOException 
     */  
    public static InputStream createThumbnails(InputStream in, int size, String imageFormat) throws IOException  
    {  
        if(imageFormat.equalsIgnoreCase("jpg"))  
        {  
              
            return createThumbnails(in, size);  
        }  
        else if(imageFormat.equalsIgnoreCase("png"))  
        {  
        BufferedImage image = Thumbnails.of(in).scale(1f).outputFormat(JPG).asBufferedImage();  
        InputStream is = getInputStream(image, JPG);  
        return createThumbnails(is, size);  
        }  
        return null;  
    }  
      
    /** 
     * 轉(zhuǎn)化為jpg格式 
     *  
     * @param in 
     * @param imageFormat 
     * @return 
     * @throws IOException 
     */  
    public static BufferedImage toJPG(BufferedImage image) throws IOException{  
          
        int width = image.getWidth();  
        int height = image.getHeight();  
        BufferedImage image_ = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);  
        Graphics2D graphic = image_.createGraphics();  
        graphic.setColor(Color.WHITE);  
        graphic.fillRect(0,0,width,height);  
        graphic.drawRenderedImage(image, null);  
        graphic.dispose();  
        return image_;  
    }  
  
    /** 
     * 生成縮略圖 
     *  
     * @param in 
     * @param width 
     * @param height 
     * @return 
     * @throws IOException 
     */  
    public static InputStream createThumbnails(InputStream in, int width, int height) throws IOException  
    {  
  
        ByteArrayOutputStream os = new ByteArrayOutputStream();  
        Thumbnailator.createThumbnail(in, os, width, height);  
        InputStream is = new ByteArrayInputStream(os.toByteArray());  
        in.close();  
        os.close();  
        return is;  
    }  
  
    /** 
     * 生成縮略圖 
     *  
     * @param in 
     * @param size 
     * @return 
     * @throws IOException 
     */  
    public static InputStream createThumbnails(InputStream in, int size) throws IOException  
    {  
  
        ByteArrayOutputStream os = new ByteArrayOutputStream();  
        Thumbnailator.createThumbnail(in, os, size, size);  
        InputStream is = new ByteArrayInputStream(os.toByteArray());  
        in.close();  
        os.close();  
        return is;  
    }  
  
    /** 
     * 添加水印 
     *  
     * @param in 
     * @param width 
     * @param height 
     * @return 
     * @throws IOException 
     */  
    public static InputStream addWaterMark(InputStream in, InputStream waterMark, int width, int height) throws IOException  
    {  
  
        ByteArrayOutputStream os = new ByteArrayOutputStream();  
        Thumbnails.of(in).size(width, height).watermark(Positions.BOTTOM_RIGHT, ImageIO.read(waterMark), 0.4f).outputQuality(0.8f).toOutputStream(os);  
        InputStream is = new ByteArrayInputStream(os.toByteArray());  
        in.close();  
        waterMark.close();  
        os.close();  
        return is;  
    }  
  
    /** 
     * 居中裁剪 
     *  
     * @param image 
     * @return 
     */  
    public static BufferedImage clipCenter(BufferedImage image)  
    {  
  
        int height = image.getHeight();  
        int width = image.getWidth();  
        int size = height >= width ? width : height;  
        int temp = 0;  
        if(height >= width)  
        {  
            temp = (height - width) / 2;  
            image = image.getSubimage(0, temp, size, size);  
        }  
        else  
        {  
            temp = (width - height) / 2;  
            image = image.getSubimage(temp, 0, size, size);  
        }  
  
        return image;  
    }  
  
    /** 
     * 裁剪圖片 
     *  
     * @param image 
     * @param x 
     * @param y 
     * @param size 
     * @return 
     */  
    public static BufferedImage cutImage(BufferedImage image, int x, int y, int size)  
    {  
  
        int height = image.getHeight();  
        int width = image.getWidth();  
        if((width >= (x + size)) && (height >= (y + size)))  
        {  
            image = image.getSubimage(x, y, size, size);  
        }  
        else  
        {  
            int temp = ((height - y) >= (width - x)) ? (width - x) : (height - y);  
            image = image.getSubimage(x, y, temp, temp);  
        }  
  
        return image;  
    }  
  
    /** 
     * 檢查格式是否合法 
     *  
     * @param imageType 
     * @return 
     */  
    public static boolean checkType(String imageType)  
    {  
  
        boolean flag = false;  
        if(JPG.equalsIgnoreCase(imageType) || PNG.equalsIgnoreCase(imageType))  
        {  
            flag = true;  
        }  
        return flag;  
    }  
  
    /** 
     * 壓縮圖片 
     * 默認(rèn)輸出50%質(zhì)量圖片 
     *  
     * @param image 
     * @return 
     * @throws IOException 
     */  
    public static InputStream compress(BufferedImage image, String readImageFormat) throws IOException  
    {  
  
        InputStream in = ImageUtils.getInputStream(image, readImageFormat);  
        ByteArrayOutputStream os = new ByteArrayOutputStream();  
        Thumbnails.of(in).size(image.getWidth(), image.getHeight()).outputQuality(0.5f).toOutputStream(os);  
        InputStream is = new ByteArrayInputStream(os.toByteArray());  
        in.close();  
        os.close();  
        return is;  
    }  
}  

http://blog.csdn.net/jieve_y/article/details/51283748

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市纲刀,隨后出現(xiàn)的幾起案子项炼,更是在濱河造成了極大的恐慌担平,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锭部,死亡現(xiàn)場(chǎng)離奇詭異暂论,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)拌禾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門取胎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人湃窍,你說(shuō)我怎么就攤上這事闻蛀。” “怎么了您市?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵觉痛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我茵休,道長(zhǎng)薪棒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任榕莺,我火速辦了婚禮俐芯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘钉鸯。我一直安慰自己吧史,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布唠雕。 她就那樣靜靜地躺著扣蜻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪及塘。 梳的紋絲不亂的頭發(fā)上莽使,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音笙僚,去河邊找鬼芳肌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛肋层,可吹牛的內(nèi)容都是我干的亿笤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼栋猖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼净薛!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蒲拉,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤肃拜,失蹤者是張志新(化名)和其女友劉穎痴腌,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體燃领,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡士聪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了猛蔽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剥悟。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖曼库,靈堂內(nèi)的尸體忽然破棺而出区岗,到底是詐尸還是另有隱情,我是刑警寧澤毁枯,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布躏尉,位于F島的核電站,受9級(jí)特大地震影響后众,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜颅拦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一蒂誉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧距帅,春花似錦右锨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至讥电,卻和暖如春蹂窖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背恩敌。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工瞬测, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人纠炮。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓月趟,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親恢口。 傳聞我的和親對(duì)象是個(gè)殘疾皇子孝宗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,113評(píng)論 1 32
  • 轉(zhuǎn)載自VR設(shè)計(jì)云課堂[http://www.reibang.com/u/c7ffdc4b379e]Unity S...
    水月凡閱讀 1,020評(píng)論 0 0
  • 他特別想把我拴在身邊,他想做佛祖耕肩,期待著我是他的孫悟空因妇,永遠(yuǎn)在他的掌控之中问潭,但他忽略了,猴子就是猴子沙峻,從來(lái)不是他之...
    鬼筆環(huán)肽666閱讀 288評(píng)論 0 0
  • 目前馬刺和猛龍的重磅交易已經(jīng)成為現(xiàn)實(shí)摔寨,雖說(shuō)這并不算是最完美的操作去枷,但這對(duì)馬刺來(lái)說(shuō)多少也是能在注定要損失倫納德的情況...
    zoneball閱讀 280評(píng)論 1 0