基于Java的图片文件格式转换和线性缩放

2008-02-23 08:16:24来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

图片文件格式转换最核心的问题就是要解决各种图片格式的编码和解码,推荐用jimi包,可从 http://java.sun.com/products/jimi/ 下载该包及其源码和demo

需要注意的是:jimi提供了对几乎所有图片格式的解码支持,但是为提供gif和tif/tiff格式的编码api,gif编码问题在网上可以找到县相关的源码,tiff好像jai:http://java.sun.com/products/java-media/jai/index.jsp提供了它的编码,不过我没有用jai,暂时用jpeg编码代替了。

察看jimi的源码,在com.sun.jimi.core中是jimi的核心处理api。

public void toJPG(String source, String dest, int quality) { 



if (dest == null || dest.trim().equals("")) 

  dest = source; 



if (!dest.toLowerCase().trim().endsWith("jpg")) { 

  dest  = ".jpg"; 

  System.out.println("Overriding to JPG, output file: "   dest); 

} 

if (quality < 0 || quality > 100 || (quality   "") == null 

|| (quality   "").equals("")) { 

  System.out.println("quality must between ’0’ and ’100’"); 

  System.out.println("set to DEFAULT value:’75’"); 

  quality = 75; 



} 

try { 

  JPGOptions options = new JPGOptions(); 

  options.setQuality(quality); 

  ImageProducer image = Jimi.getImageProducer(source); 

  JimiWriter writer = Jimi.createJimiWriter(dest); 

  writer.setSource(image); 

  // 加入属性设置,非必要 

  // /* 

  writer.setOptions(options); 

  // */ 

  writer.putImage(dest); 

} catch (JimiException je) { 

  System.err.println("Error: "   je); 

} 

}

在进行格式转换时,并不需要关心原图的格式,只要要转换的图片格式在jimi的解码格式范围内,就可以完全透明的进行decode过程:

ImageProducer image = Jimi.getImageProducer(source);

实际的解码只需要以行代码,就这么简单。

编码过程最简单的也只需要很少的代码:

JimiWriter writer = Jimi.createJimiWriter(dest); 

writer.setSource(image); 

// 加入属性设置,非必要 

// /* 

writer.setOptions(options); 

// */ 

writer.putImage(dest);

以上代码就完成了图片编码到输出到os生成转换后文件的全过程。

上面代码中的 writer.setOptions(options)是用来对输出文件的属性进行相关的设置,每种格式的属性都不一样,com.sun.jimi.core.options.*中针对每种图片编码格式的相关属性提供了getter和setter方法,可以方便的进行设置:

com.sun.jimi.core.options.*中针对每种图片编码格式的相关属性提供了getter和setter方法,可以方便的进行设置:

JPGOptions options = new JPGOptions();

options.setQuality(quality);

格式转换就这么简单。

jimi不支持的encode格式的解决

/** 

* 

* @param source 

* @param dest 

* @throws JimiException 

*/ 

public void toGIF(String source, String dest) throws JimiException { 

  if (dest == null || dest.trim().equals("")) 

   dest = source; 

  // 1:转换为jpg 

  if (!dest.toLowerCase().trim().endsWith("jpg")) { 

   dest  = ".jpg"; 

  } 

  toJPG(source, dest, 75); 



  BufferedImage file_in = null; 

  File file = new File(dest); 

  try { 

   file_in = javax.imageio.ImageIO.read(file); 

  } catch (IOException e) { 

   e.printStackTrace(); 

  } 



  int end = dest.lastIndexOf("."); 

  file.deleteOnExit(); 

  // output *.gif 

  file.renameTo(new File(dest.substring(0, end)   ".gif")); 

  // jpg to gif 

  AnimatedGifEncoder e = new AnimatedGifEncoder(); 

  e.start(dest); 

  e.addFrame(file_in); 

  e.finish(); 

  

}

这里用到了AnimatedGifEncoder 类,是我在网上搜索到的,对gif编码提供了一个实现,虽然还有待晚善的地方,不过单作格式转关已经够用了。

AnimatedGifEncoder e = new AnimatedGifEncoder();

e.start(dest);

e.addFrame(file_in);

e.finish();

需要注意的是:AnimatedGifEncoder 不能对所有格式的图片正确的识别,所以先要将其他格式转为jpg格式(最简单的方法是用imageIO)

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:新手入门:J2EE初学者要理解的几个问题

下一篇:实例解析 在Eclipse3.2上部署JSP全过程