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默認的編解碼類,因此使用這個庫是徹底無入侵的