java 缩略图

标签: java | 发表时间:2014-05-24 17:35 | 作者:TimerBin
出处:http://www.iteye.com

文章说明:根据用户上传的图片按等比例生成相应的的缩略图,两小例笔记。

第一、java-image-scaling 开源小工具生成图片缩略图

Google Code Url:http://code.google.com/p/java-image-scaling/

Maven地址: http://mvnrepository.com/artifact/com.mortennobel/java-image-scaling/

以下实例以0.8.5为例实例

1、Maven配置文件Pom.xml

   <dependency>
          <groupId>com.mortennobel</groupId>
          <artifactId>java-image-scaling</artifactId>
           <version>0.8.5</version>
  </dependency>

2、简单工具类

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import com.mortennobel.imagescaling.ResampleOp;

 

/**
  * 生产缩略图主方法
  * @param fileFromPath 来源文件地址
  * @param fileOutPath 输出缩略图地址
  * @param outWidth   输出缩略图宽
  * @param outHeight  输出缩略图高
  * @throws IOException
  */
  public void chreatePictureChange(String fileFromPath,String fileOutPath, int outWidth, int outHeight) throws IOException {
      //创建输出缩略图文件 =空
      new File(fileOutPath).mkdirs();
      //来源文件
      BufferedImage fromImage = makeFormFile(new File(fileFromPath));
      //输出缩略图尺寸计算
       int[] outSize = countOutImgSize(fromImage, outWidth, outHeight);
       //输出缩略图 文件类型
        String outFileType = fileFromPath.substring(fileFromPath.lastIndexOf(".")+1);
        //输出缩略图 IO输出
        writeOutImage(makeOutFile(fromImage, (int) outSize[0], (int) outSize[1]),outFileType ,new File(fileOutPath));
  }

   /**
     * 将地址转为图片
     * @param file
     * @return
     * @throws IOException
     */
private  BufferedImage makeFormFile(File file) throws IOException {
      BufferedImage image = null;
      if (file != null && file.isFile() && file.exists()) {
           image = ImageIO.read(file);
       }
        return image;
 }

/**
  * 初始化 封装 目标图片大小
  * @param fromImage 源文件
  * @param outWidth 目标文件宽
  * @param outHeight 目标文件高
   * @return
   */
 private  int[] countOutImgSize(BufferedImage fromImage, int outWidth, int outHeight) {
         int[] zoomSize = new int[2];
         int fromWidth = fromImage.getWidth();
         int fromcHeigth = fromImage.getHeight();
         // 根据输出缩略图的宽和高 除以  原图的宽与高 获取缩放比例
         double ratio = 1.0;
         if (fromcHeigth > outHeight || fromWidth > outWidth) {
                // 根据原图中的 宽和高中较大的 值进行缩放
                if (fromcHeigth > fromWidth) {
                      ratio = outHeight * 1.0 / fromcHeigth;
                } else {
                      ratio = outWidth * 1.0 / fromWidth;
              }
         }
         //计算输出的缩略图宽度和高度
         zoomSize[0] = (int) (fromImage.getWidth() * ratio);
         zoomSize[1] = (int) (fromImage.getHeight() * ratio);
         return zoomSize;
  }

 /**
  * 组装 目标文件流
  * @param fromImage 源文件
  * @param outWidth  目标文件宽
  * @param outHeigth 目标文件高
  * @return
  */
 private BufferedImage makeOutFile(BufferedImage fromImage, int outWidth, int outHeigth) {
        ResampleOp resampleOp = new ResampleOp(outWidth, outHeigth);
        BufferedImage tag = resampleOp.filter(fromImage, null);
        return tag;
 }
 /**
  * 文件写出
  * @param fromImage 文件源
  * @param outName 目标文件名
  * @param outFileType 根据原文件名称后缀获得、指定生成缩略图是以哪种格式生成(JPG/PNG/GIF等) 
  * @throws IOException
  */
private  void writeOutImage(BufferedImage fromImage, String outFileType, File outFile)
    throws IOException {
          if (fromImage != null && outFileType!= null && !"".equals(outFileType)
          && outFile != null) {
               ImageIO.write(fromImage, outFileType, outFile);
           }
  }

直接调用chreatePictureChange方法就可以生成图片缩略图信息

所遇到问题:

1、生成缩略图的尺寸尽量宽高全部都填写---已解决。

2、注意生成的缩略图所设置的格式信息,部分PNG图片格式强制转为JPG时会导致生成的缩略图图片变为红色 --已解决。

优点:生成的大于当前尺寸的缩略图所占物理空间较小(小于等于原图大小),速度较快。

确定:图片清晰度较差。

第二种、thumbnailator 图片缩略小工具

Google Code Url: https://code.google.com/p/thumbnailator/

Maven下载地址: http://mvnrepository.com/artifact/net.coobird/thumbnailator

以下实例以0.4.6版本为例:

1、Maven配置文件Pom.xml

   <dependency>
          <groupId>net.coobird</groupId>
          <artifactId>thumbnailator</artifactId>
          <version>0.4.6</version>
  </dependency>

2、简单工具类

     /**
      * 图片缩略图切割 --- 根据文件地址 生成图片缩略图
      * @param fileFromPath 图片源文件地址
      * @param fileOutPath 图片缩略图地址
      * @param outWidth  图片缩略图宽度
      * @param outHeight 图片缩略图高度
      * @param scale 缩放比例
      * @param rotate 旋转度数
      * @return
      */
    public void chreatePictureChange(String fileFromPath,String fileOutPath, Integer outWidth, Integer outHeight, Float scale, Integer rotate) {
            Builder<File> builder = (Builder<File>) Thumbnails.of(fileFromPath);
            if (null != outWidth && null == outHeight) {
                builder.width(outWidth);
            }
            if (null == outWidth && null != outHeight) {
                builder.height(outHeight);
            }
            if (null != outWidth && null != outHeight) {
                builder.size(outWidth, outHeight);
            }
            if (null != scale) {
                builder.scale(scale);
            }
            if (null != rotate) {
                builder.rotate(rotate);
            }
            builder.toFile(fileOutPath);
     }

     /**
       * 图片缩略图切割 --- 根据文件流 生成图片缩略图
       * @param fileFrom 图片源文件地址
       * @param fileOutPath 图片缩略图地址
       * @param outWidth  图片缩略图宽度
       * @param outHeight 图片缩略图高度
       * @param scale 缩放比例
       * @param rotate 旋转度数
       * @return
       */
     public static void chreatePictureChange(InputStream fileFrom,String fileOutPath, Integer outWidth, Integer outHeight, Float scale, Integer rotate) {
         Boolean pictureChangeResult = false;
         try {
             Builder<InputStream> builder = (Builder<InputStream>) Thumbnails.of(fileFrom);
             if (null != outWidth && null == outHeight) {
                 builder.width(outWidth);
             }
             if (null == outWidth && null != outHeight) {
                 builder.height(outHeight);
             }
             if (null != outWidth && null != outHeight) {
                 builder.size(outWidth, outHeight);
             }
             if (null != scale) {
                 builder.scale(scale);
             }
             if (null != rotate) {
                 builder.rotate(rotate);
             }
             builder.outputQuality(1.0d);
             builder.toFile(fileOutPath);
             pictureChangeResult = true;
         } catch (Exception e) {
             e.printStackTrace();
         }finally{
          fileFrom.close();
         }
     }

 outputQuality:输出的图片质量,范围:0.0~1.0,1为最高质量。注意使用该方法时输出的图片格式必须为jpg(即outputFormat("jpg")。其他格式我没试过,感兴趣的自己可以试试)。否则若是输出png格式图片,则该方法作用无效【这其实应该算是bug】。

来源地址: http://blog.csdn.net/wangpeng047/article/details/19624993

 

优点:清晰,可以指定缩略图的清晰度,功能强大。

缺点:生成缩略图物理大小大于原图,超出很多。

 

 

 

 

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [java] 推荐:

Java中的锁(Locks in Java)

- - 并发编程网 - ifeve.com
原文链接 作者:Jakob Jenkov 译者:申章 校对:丁一. 锁像synchronized同步块一样,是一种线程同步机制,但比Java中的synchronized同步块更复杂. 因为锁(以及其它更高级的线程同步机制)是由synchronized同步块的方式实现的,所以我们还不能完全摆脱synchronized关键字( 译者注:这说的是Java 5之前的情况).

Java PaaS 对决

- 呆瓜 - IBM developerWorks 中国 : 文档库
本文为 Java 开发人员比较了三种主要的 Platform as a Service (PaaS) 产品:Google App Engine for Java、Amazon Elastic Beanstalk 和 CloudBees RUN@Cloud. 它分析了每种服务独特的技术方法、优点以及缺点,而且还讨论了常见的解决方法.

Java浮点数

- d0ngd0ng - 译言-电脑/网络/数码科技
Thomas Wang, 2000年3月. Java浮点数的定义大体上遵守了二进制浮点运算标准(即IEEE 754标准). IEEE 754标准提供了浮点数无穷,负无穷,负零和非数字(Not a number,简称NaN)的定义. 在Java开发方面,这些东西经常被多数程序员混淆. 在本文中,我们将讨论计算这些特殊的浮点数相关的结果.

Qt——转战Java?

- - 博客 - 伯乐在线
编者按:事实上,在跨平台开发方面,Qt仍是最好的工具之一,无可厚非,但Qt目前没有得到任何主流移动操作系统的正式支持. 诺基亚的未来计划,定位非常模糊,这也是令很多第三方开发者感到失望,因此将导致诺基亚屡遭失败的原因. Qt的主要开发者之一Mirko Boehm在博客上强烈讽刺Nokia裁了Qt部门的决定,称其为“绝望之举”,而非“策略变更”.

java 验证码

- - ITeye博客
// 创建字体,字体的大小应该根据图片的高度来定. // 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到. // randomCode用于保存随机产生的验证码,以便用户登录后进行验证. // 随机产生codeCount数字的验证码. // 得到随机产生的验证码数字. // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同.

Java异常

- - CSDN博客推荐文章
“好的程序设计语言能够帮助程序员写出好程序,但是无论哪种语言都避免不了程序员写出坏的程序.                                                                                                                          ----《Java编程思想》.

java面试题

- - Java - 编程语言 - ITeye博客
 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面. 抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节. 抽象包括两个方面,一是过程抽象,二是数据抽象.  继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法. 对象的一个新类可以从现有的类中派生,这个过程称为类继承.

Java使用memcached

- - 互联网 - ITeye博客
首先到 http://danga.com/memcached下载memcached的windows版本和java客户端jar包,目前最新版本是memcached-1.2.1-win32.zip和java_memcached-release_1.6.zip,分别解压后即可. 然后是安装运行memcached服务器,我们将memcached-1.2.1-win32.zip解压后,进入其目录,然后运行如下命令:c:>;memcached.exe -d install
c:>memcached.exe -l 127.0.0.1 -m 32 -d start.

Java线程池

- - 企业架构 - ITeye博客
线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的. 在jdk1.5之后这一情况有了很大的改观. Jdk1.5之后加入了java.util.concurrent包,这个包中主要介绍java中线程以及线程池的使用. 为我们在开发中处理线程的问题提供了非常大的帮助.

java 缩略图

- - 开源软件 - ITeye博客
文章说明:根据用户上传的图片按等比例生成相应的的缩略图,两小例笔记. 第一、java-image-scaling 开源小工具生成图片缩略图. Maven地址: http://mvnrepository.com/artifact/com.mortennobel/java-image-scaling/.