高清縮略圖之Thumbnailator

搞網站開發,常常要用到的一個功能是生成縮略圖。若是對縮略圖的質量要求不高,直接用JDK提供的Image API就能夠搞定,簡單示例: java

File _file = new File("/Order005-0001.jpg"); //讀入文件
Image src = javax.imageio.ImageIO.read(_file); //構造Image對象
int wideth=src.getWidth(null); //獲得源圖寬
int height=src.getHeight(null); //獲得源圖長
BufferedImage tag = new BufferedImage(wideth/2,height/2,BufferedImage.TYPE_INT_RGB);
tag.getGraphics().drawImage(src,0,0,wideth/2,height/2,null); //繪製縮小後的圖
FileOutputStream out=new FileOutputStream("newfile.jpg"); //輸出到文件流
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(tag); //近JPEG編碼
//System.out.print(width+"*"+height);
out.close();

注意: 算法

在Eclipse中運行上面這段代碼,須要引入兩個包:
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
可能會報錯:
Access restriction: The type JPEGImageEncoder is not accessible due to restriction on required library C:\Java\jre1.6.0_07\lib\rt.jar
這是由於這兩個類在rt.jar包中,屬於受訪問的API,Eclipse 默認把這些受訪問限制的API設成了ERROR。 ide

解決辦法: 工具

只要把Windows-Preferences-Java-Complicer- Errors/Warnings裏面的Deprecated and restricted API中的Forbidden references(access rules)選爲Warning就能夠編譯經過。 網站

若是對縮略圖的質量要求高,這時候就須要本身寫算法來實現了。網上能夠找到不少有關縮略圖的算法,其中有些效果仍是不錯的,你們能夠去試一下。今天要介紹的是一個開源的java縮略圖工具,名叫Thumbnailator,使用起來很是簡單,兩三行代碼就可以從現有圖片生成縮略圖,且容許微調縮略圖生成,同時保持了須要寫入到最低限度的代碼量。同時還支持根據一個目錄批量生成縮略圖。如下是代碼示例: ui

1.指定大小進行縮放 google

/*   
 * 若圖片橫比300小,高比300小,不變   
 * 若圖片橫比300小,高比300大,高縮小到300,圖片比例不變   
 * 若圖片橫比300大,高比300小,橫縮小到300,圖片比例不變   
 * 若圖片橫比300大,高比300大,圖片按比例縮小,橫爲300或高爲300   
 */  
Thumbnails.of("D:\\fen.jpg") 
		.size(300, 300) 
		//.keepAspectRatio(false) //默認是true,按比例縮小
		.outputQuality(0.95f)//設置壓縮比,決定壓縮後圖片的質量
		.outputFormat("JPEG")
		.toFile("D:\\fen_300.jpeg");

原圖: 編碼

fen

生成的縮略圖: spa

fen_300

2.旋轉 .net

//rotate(角度),正數:順時針 負數:逆時針  
Thumbnails.of("D:\\fen.jpg")   
        .size(1280, 1024)  
        .rotate(90)   
        .toFile("D:\\rotate_90.jpg");

3.裁剪

//指定座標  
Thumbnails.of("D:\\fen.jpg")  
        .sourceRegion(600, 500, 400, 400)  
        .size(200, 200)  
        .keepAspectRatio(false)   
        .toFile("D:\\fen_cut.jpg");

4.水印

//watermark(位置,水印圖,透明度)  
Thumbnails.of("D:\\fen.jpg")   
        .size(1280, 1024)  
        .watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("D:\\logo.png")), 0.5f)   
        .outputQuality(0.8f)   
        .toFile("D:\\fen_watermark.jpg");

更多的例子請看Thumbnails Demo

總結:以上僅是Thumbnails的一小部分功能,從中能夠看出Thumbnails的功能強大,並且使用極其方便,對於通常的圖片處理足夠了,若是想對圖片進行更加複雜的處理,則須要用到ImageMagick或者了GraphicsMagick了。下一篇文章將介紹GraphicsMagick的基本用法。

相關文章
相關標籤/搜索