Skip to content
温高铁 edited this page Jul 25, 2013 · 4 revisions

Java下处理图形是一件很头疼的工作, 这方面Java虽然提供了JAI/ImageIO API组件让程序员可以完成大量的操作, 但是, 由于固有一些缺陷, 导致应用的稳定性/常用功能受到极大的影响。 另外一些C/C++制作的图形库存在各种各样的问题, 比如由之封装的Java API JImageMagic, 稍微大点压力的群集可能每天造成数次的崩溃 。 我们经过根据阿里巴巴的业务需求, 开发了SimpleImage API 用处理图形的读写。 这个包并没有开发图形的所有功能, 我们是根据JAI/ImageIO的天生弱点,开发的增强功能。 希望这些工作能对开发JavaWeb应用能带来便利。当前最新版本实现的主要功能有:

  • JPEG解码增强(无内存泄漏,支持CMYK)
  • GIF动画的读取和保存
  • 图像颜色空间转换
  • 图像高质量缩略
  • 图像打水印文字

Example

下面的代码实现了图像读取,将图像缩略到1024x1024大小以内,如果图像不到1024x1024大小则不做任何操作,最后保存图像的功能

  import java.io.File;
  import java.io.FileInputStream;
  import java.io.FileOutputStream;
   
  import org.apache.commons.io.IOUtils;
  
  import com.alibaba.simpleimage.render.ReadRender;
  import com.alibaba.simpleimage.render.ScaleParameter;
  import com.alibaba.simpleimage.render.ScaleRender;
  import com.alibaba.simpleimage.render.WriteParameter;
  import com.alibaba.simpleimage.render.WriteRender;

  File in = new File("/source.jpg");      //原图片
  File out = new File("/dest.jpg");       //目的图片
  ScaleParameter scaleParam = new ScaleParameter(false, 1024, 1024);  //将图像缩略到1024x1024以内,不足1024x1024则不做任何处理
  WriteParameter writeParam = new WriteParameter();   //输出参数,默认输出格式为JPEG

  FileInputStream inStream = null;
  FileOutputStream outStream = null;
  ImageRender wr = null;
  try {
      inStream = new FileInputStream(in);
      outStream = new FileOutputStream(out);
      ImageRender rr = new ReadRender(inStream);
      ImageRender sr = new ScaleRender(rr, scaleParam);
      wr = new WriteRender(sr, outStream, writeParam);
   
      wr.render();                            //触发图像处理
  } catch(Exception e) {
      e.printStackTrace();
  } finally {
      IOUtils.closeQuietly(inStream);         //图片文件输入输出流必须记得关闭
      IOUtils.closeQuietly(outStream);
      if (wr != null) {
          try {
              wr.dispose();                   //释放simpleImage的内部资源
          } catch (SimpleImageException ignore) {
              // skip ... 
          }
      }
  }
Clone this wiki locally