java 圖片處理

http://blog.csdn.net/fengwind1/article/details/51919848git

********************************************************github

用到兩個第三方庫工具

一、thumbnailator:https://github.com/coobird/thumbnailatorspa

二、TwelveMonkeys:https://github.com/haraldk/TwelveMonkeys.net

thumbnailator是圖片處理的工具類,提供了不少圖片處理的便捷的方法,這樣咱們就不要用jdk底層的ImageIO類了3d

TwelveMonkeys是一個圖片編解碼庫,支持bmp,jpeg,tiff,pnm,psd等。jdk自己也支持一些圖片的處理,如jpeg,bmp,png,可是jdk的圖片編解碼庫不是很強。
code

爲何須要TwelveMonkeys?我在處理jpeg圖片的時候,發現用jdk自帶的jpeg解析器不能解析全部的jpeg格式文件(部分Photoshop處理過的jpeg圖片)。出現unsupported formate 錯誤,用這個庫後,沒有出現錯誤。orm

thumbnailator的功能有按比例縮放,固定尺寸縮放,按尺寸等比縮放,旋轉,加水印,壓縮圖片質量。thumbnailator固定尺寸縮放有可能會形成圖片變型,有的時候咱們可能須要固定尺寸並等比縮放,不夠的地方補上空白。它沒有提供直接的功能。下面是本身寫的代碼blog

    public static void compressByPx(InputStream inputStream, OutputStream outputStream,int width, int height, boolean equalProportion) throws IOException {  
           BufferedImage bufferedImage=ImageIO.read(inputStream);  
           int sWidth=bufferedImage.getWidth();  
           int sHeight=bufferedImage.getHeight();  
           int diffWidth=0;  
           int diffHeight=0;  
           if(equalProportion){  
               if((double)sWidth/width>(double)sHeight/height){  
                   int height2=width*sHeight/sWidth;  
                   diffHeight=(height-height2)/2;  
               }else if((double)sWidth/width<(double)sHeight/height){  
                   int width2=height*sWidth/sHeight;  
                   diffWidth=(width-width2)/2;  
               }  
           }  
           BufferedImage nbufferedImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);  
           nbufferedImage.getGraphics().fillRect(0,0,width,height);//填充整個屏幕  
           nbufferedImage.getGraphics().drawImage(bufferedImage, diffWidth, diffHeight, width-diffWidth*2, height-diffHeight*2, null); // 繪製縮小後的圖  
           ImageIO.write(nbufferedImage,"jpg",outputStream);  
           outputStream.close();  
           inputStream.close();  
       }  

equalProportion表明是否等比例縮放,若是是則等比縮放,並在不夠的地方留白接口


一個1024x674的源圖片,如今要生成一個800x800的圖片

源文件

    Thumbnails.of(new File("e:/x/1.jpg"))  
                   .size(800, 800)  
                   .toFile(new File("e:/x/thumbnail/1.jpg"));  

使用size方法生成的圖片

這個圖片沒有變型,但他的實際像素並非800x800,而是800x527.

Thumbnails.of(new File("e:/x/1.jpg"))  
                .forceSize(800, 800)  
                .toFile(new File("e:/x/thumbnail/1.jpg")); 

使用forceSize方法生成的圖片

這張圖片的實際像素是800x800

    try {  
                compressByPx(new FileInputStream("E:/x/1.jpg"),new FileOutputStream("E:/x/thumbnail/1.jpg"),800,800,true);  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  

使用本身寫的compressByPx方法產生的圖片

 

這張圖片的實際像素是800x800,也沒有產生變型,而是在上部分和下部分留白了一塊。你們根據實際狀況的須要選擇使用哪一個方法。


TwelveMonkeys的使用比較簡單,只要把相關的jar包加入到類路徑,他的類咱們基本不會用到,只要使用jdk ImageIO或其上層的接口就好了。jdk的ImageIO有自動發現功能,會自動查找相關的編解碼類並使用,而不使用jdk默認的編解碼類,因此使用這個庫是徹底無入侵的

相關文章
相關標籤/搜索