2008年12月11日 星期四

How to read size and resize image without graphics (Thumbnail)

現今操作圖片都是使用java awt, awt裡提供getScaleInstance, 這個被批得半死, performance差的要死, 所以陸續其它人提出一些方式, 再測試過那些方式之後, 發現java 早在1.1的時代, 就有JIMI, 不知道是不是因為太舊了, 所以大家都把他遺忘了, 而改去用後來的ImageIO.
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();
}
}
Usage:
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

沒有留言: