現今操作圖片都是使用java awt, awt裡提供getScaleInstance, 這個被批得半死, performance差的要死, 所以陸續其它人提出一些方式, 再測試過那些方式之後, 發現java 早在1.1的時代, 就有JIMI, 不知道是不是因為太舊了, 所以大家都把他遺忘了, 而改去用後來的ImageIO.
Usage:
Java Image Management Interface, JIMI
要使用JIMI就如JMF一樣, 先到http://java.sun.com/products/jimi/
下載jar檔回來即可import.
/** * Insert the method's description here.
* Creation date: (8/12/01 6:28:37 PM) */
void writeWithResizeMediaTracker(){ try {
Image inImage = new ImageIcon("input.jpg").getImage();
//
int maxDim = 120; double scale = (double) maxDim / (double) inImage.getHeight(null); if (inImage.getWidth(null) > inImage.getHeight(null)) { scale = (double) maxDim / (double) inImage.getWidth(null); }
// Determine size of new image.
//One of them
// should equal maxDim. int scaledW = (int) (scale * inImage.getWidth(null)); int scaledH = (int) (scale * inImage.getHeight(null));
// // System.out.println(">> " + inImage.getSource().getClass() + " aspect ratio = " + scaledW + " , " + scaledH); Image img = inImage.getScaledInstance(scaledW , scaledH, Image.SCALE_SMOOTH); File outputFile = new File("output.jpg"); outputFile.delete(); JimiRasterImage raster = Jimi.createRasterImage(img.getSource()); FileOutputStream fos = new FileOutputStream(outputFile); Jimi.putImage("image/jpeg", raster, fos); fos.flush(); fos.close(); } catch (Throwable t) { t.printStackTrace(); }}
Input: input.jpg
Output: output.jpg
MaxDim: 最大長邊的pixel數
Thx for Kaan:
http://home.tiscali.nl/~bmc88/java/sbook/
http://home.tiscali.nl/~bmc88/java/sbook/0132.html
沒有留言:
張貼留言