写了一个实用的图像放大缩小程序,但是动画GIF转换后不会显示了,只有第一帧

写了一个实用的图像放大缩小程序,但是动画GIF转换后不会显示了,只有第一帧
代码如下,有没做过GIF转换的,提提建议一下,谢谢。 

import java.awt.Canvas;

import java.awt.Component;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.image.AreaAveragingScaleFilter;

import java.awt.image.BufferedImage;

import java.awt.image.FilteredImageSource;

import java.io.File;

import java.util.Arrays;

import javax.imageio.ImageIO;

import org.apache.log4j.Logger;

 

/**

 *一个实用的图像放大缩小程序

 *

 *@authorYuLimin

 */

publicclass ZoomImage

{

    privatestaticfinal Logger logger = Logger.getLogger(ZoomImage.class);

    privatestatic Component component = new Canvas();

    // ".pcx","tga",".tif"这三种格式目前还不支持;

    // 这些定义的格式经过我测试过是可以支持的。

    privatestatic String[] imageFormatArray = new String[]{".jpg",".jpeg",".gif",".png",".bmp"};

 

    /**

     *测试用例

     *

     *@paramargs

     *@throwsException

     */

    publicstaticvoid main(String[] args) throws Exception

    {

       ZoomImage zoomImage = new ZoomImage();

       zoomImage.listFormt();

   // 缩小四倍  

   zoomImage.zoom("E:/图片/城市风光",0.25,false);  

   // 放大四倍  

   zoomImage.zoom("E:/图片/自然风光",4,false);

    }

 

    /**

     *查看图像I/O库所支持的图像格式有哪些格式

     */ 

    publicvoid listFormt()

    {

       String readerMIMETypes[] = ImageIO.getReaderMIMETypes();

       String writerMIMETypes[] = ImageIO.getWriterMIMETypes();

       String readerFormatNames[] = ImageIO.getReaderFormatNames();

       String writerFormatNames[] = ImageIO.getWriterFormatNames();

       if(logger.isInfoEnabled())

       {

           logger.info("ReaderMIMETypes:" + Arrays.asList(readerMIMETypes));

           logger.info("WriterMIMETypes:" + Arrays.asList(writerMIMETypes));

           logger.info("ReaderFormatNames:" + Arrays.asList(readerFormatNames));

           logger.info("WriterFormatNames:" + Arrays.asList(writerFormatNames));

       }

    }
 

    /**

     *校验图像文件的格式是否可以进行缩放

     *

     *@paramfileName

     *@return

     */

    publicboolean verifyImageFormat(String fileName)

    {

       boolean result = false;

       for(int i = 0;i < imageFormatArray.length;i++)

       {

           if(fileName.toLowerCase().lastIndexOf(imageFormatArray[i]) == (fileName.length() - imageFormatArray[i].length()))

           {

              result = true;

              break;

           }

       }

       return result;

    }

 

    /**

     *将目录下的所有图像进行放大缩小

     *

     *@paramstrDir图像的目录

     *@paramzoomRatio放大缩小的倍率

     *@paramrebuild是否重新创建,即已经存在的图像是否覆盖重建

     *@throwsException

     */

    publicvoid zoom(String strDir,double zoomRatio,boolean rebuild) throws Exception

    {

       File fileDir = new File(strDir);

       if(!fileDir.exists())

       {

           logger.warn("Not exist:" + strDir);

           return;

       }

       String dirTarget = strDir + "/Zoom" + zoomRatio;

       File fileTarget = new File(dirTarget);

       if(!fileTarget.exists())

       {

           fileTarget.mkdir();

       }

       File[] files = fileDir.listFiles();

       StringBuilder stringBuilder = new StringBuilder();

       for(int i = 0;i < files.length;i++)

       {

           String fileFullName = files[i].getCanonicalPath();

           String fileShortName = files[i].getName();

           if(!new File(fileFullName).isDirectory())// 排除二级目录,如果想就再递归一次,这里省略

           {

              if(verifyImageFormat(fileShortName))

              {

                  if(logger.isInfoEnabled())

                  {

                     logger.info("Begin Zoom:" + fileFullName);

                  }

                  stringBuilder = new StringBuilder();

                  stringBuilder.append(dirTarget).append("/").append(fileShortName);

                  if(!new File(stringBuilder.toString()).exists() || rebuild)

                  {

                     try

                     {

                         createZoomSizeImage(fileFullName,stringBuilder.toString(),zoomRatio);

                     }

                     catch(Exception e)

                     {

                         logger.error("createZoomSizeImage Error:" + fileFullName,e);

                     }

                  }

                  if(logger.isInfoEnabled())

                  {

                     logger.info("End Zoom:" + fileFullName);

                  }

              }

              else

              {

                  logger.warn("Can't Zoom:" + fileFullName);

              }

           }

       }

    }

 

    /**

     *按比例进行放大缩小图像,zoomRatio=1为原大,zoomRatio>1为放大,zoomRatio< 1 为缩小

     *

     *@paramfileName

     *@paramfileNameTarget

     *@paramzoomRatio

     *@throwsException

     */

    publicvoid createZoomSizeImage(String fileName,String fileNameTarget,double zoomRatio) throws Exception

    {

       Image image = ImageIO.read(new File(fileName));

       int width = new Double(image.getWidth(null) * zoomRatio).intValue();

       int height = new Double(image.getHeight(null) * zoomRatio).intValue();

       AreaAveragingScaleFilter areaAveragingScaleFilter = new AreaAveragingScaleFilter(width,height);

       FilteredImageSource filteredImageSource = new FilteredImageSource(image.getSource(),areaAveragingScaleFilter);

       BufferedImage bufferedImage = new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR);

       Graphics graphics = bufferedImage.createGraphics();

       graphics.drawImage(component.createImage(filteredImageSource),0,0,null);

       ImageIO.write(bufferedImage,"JPEG",new File(fileNameTarget));

    }

}

 

时间: 2024-10-06 10:31:32

写了一个实用的图像放大缩小程序,但是动画GIF转换后不会显示了,只有第一帧的相关文章

编程-求助怎样用PHP做一个图片分层(放大缩小)浏览的效果?

问题描述 求助怎样用PHP做一个图片分层(放大缩小)浏览的效果? 我需要做一个如下链接网站的图片浏览效果.http://brain-maps.org/ajax-viewer.php?datid=42&sname=385 1.首先是鼠标滚轮滚动就能放大缩小,鼠标按住左键移动,就能像手抓住那个点一样显示反向拉过来的内容. 2.然后这些图是很大的,有的好几个G,所以把图片分成很多层的,每层又有很多张图片的切片组成,需要显示的时候才载入. 要做成这些效果,应该是怎样的编程思路呢?需要用到哪些技术? 我刚

J2ME插值算法实现图片的放大缩小

前段时间接触了一些数字图像处理的问题,在1位师兄的指导下,在j2me平台,完成了一些基本的2D图像处理算法.就当是对这段知识做一下总结,决定把这些算法写出来,和各位朋友共同探讨.这篇文章先介绍图像放大缩小的实现,程序是以Nokia S40的机器为平台实现的. 1.实现图形缩放的基本思想: 图像的变形变换,简单的说就是把源图像每个点坐标通过变形运算转为目标图像相应点的新坐标,但是这样会导致一个问题就是目标点的坐标通常不会是整数.所以我们在做放大变换时,需要计算生成没有被映射到的点:而在缩小变换时,

html5-文字根据页面放大缩小,怎么逐渐的放大缩小,关键是“逐渐”二字

问题描述 文字根据页面放大缩小,怎么逐渐的放大缩小,关键是"逐渐"二字 做网站,我是用百分比做的,出现一个问题,如果浏览器页面大小改变, 文字怎么跟着也逐渐放大和缩小,必须要 文字逐渐的 放大和缩小?关键是"逐渐"二字. 解决方案 jQuery animate()方法,创建自定义动画 <!DOCTYPE html> $(document).ready(function(){ $(""button"").click(

编程-为什么安卓adt上运行我写的一个程序会提示“很抱歉,已停止运行”?

问题描述 为什么安卓adt上运行我写的一个程序会提示"很抱歉,已停止运行"? 如题,我写的一个下拉列表与OnItemSelectedListener事件的程序,编译是没问题的.然后run,在虚拟机中打开该程序就显示"很抱歉,xxxx已停止运行".我运行另一个就用一个TextView显示"HelloWord字符串"的就没问题. 请问这是怎么回事?应该怎么解决? 解决方案 看下日志,然后贴一下日志相关信息或者百度一下就知道了 解决方案二: 连上电脑运

坐标-最近有需求实现一个类似地图的应用,点击地图上某个点,能显示相应的信息,有放大缩小的功能

问题描述 最近有需求实现一个类似地图的应用,点击地图上某个点,能显示相应的信息,有放大缩小的功能 5C 背景不是地图,是自己的图片.不使用百度和谷歌地图的API.这种功能该如何实现呢?OpenLayer可以么?或者其他的解决方案?谢谢! 解决方案 有现成的干嘛不用?openlayer也是第三方的啊,相关图片也是从他们网站加载的吧.. 如果你的不是很负责,自己写一个,监视鼠标滚动更换图片即可.. 解决方案二: 我过去用Flash做过一个电子地图.可以实现. 解决方案三: 试试ArcGis这个也可以

Silverlight实用窍门系列:51.Silverlight页面控件的放大缩小、Silverlight和Html控件的互相操作【附带源码实例】

    本节将讲述三个Silverlight中应用的小技巧:Silverlight页面的放大缩小.Silverlight操作Html.Html操作Silverlight控件. 一.Silverlight页面的放大缩小         首先对于Silverlight页面的放大缩小我们可以使用ScaleTransform对Canvas控件进行设置.这样所有在该Canvas控件内的所有子控件都被放大缩小.         下面我们看Xaml源码如下: <Canvas MouseWheel="La

C#图像放大问题解决方法

放大|解决|问题    最近在写工具的时候发现了一个很恶心的问题,当用DrawImage做图像放大的时候C#的默认放大算法不是NearestNeighbor算法,而Java Swing的drawImage放大算法默认为NearestNeighbor算法,解决方法是:         g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;         本以为这样就解决问题了,结果放大出来

C#的图像放大问题

最近在写工具的时候发现了一个很恶心的问题,当用DrawImage做图像放大的时候C#的默认放大算法不是NearestNeighbor算法,而Java Swing的drawImage放大算法默认为NearestNeighbor算法,解决方法是: g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; 本以为这样就解决问题了,结果放大出来的图像左上顶点还少了半个像素,也就是说如果放大图像是8倍

Flash AS2教程:鼠标感应放大缩小图片效果

  第一步:我们新建flash文档,帧频设置为40,我们导入一张图片或者在主场景中画一个东西,然后右键转换为元件--影片剪辑元件. 第二步:现在在你的库面板中是否是有元件一?如果做对的话是肯定有的(就是你第一步转化成的元件),我们新建一影片剪辑元件,把元件一拖到元件2的舞台中,然后回到元件1中进行第三步 第三步:到元件一中的第8帧插入关键帧(以帧频来确定),默认帧频下为8帧差不多了,在场景中把此元件用左边的任意变形工具使其放大一定程度,然后在第16帧处又插入一关键帧,又使其缩小到第一帧的大小,然