閱讀204 返回首頁    go 技術社區[雲棲]


寫了一個實用的圖像放大縮小程序,但是動畫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));
    }
}
 

最後更新:2017-04-02 00:06:21

  上一篇:go Windows下的tail一二三:tail、BareTail、WinTail
  下一篇:go 讓人眼花繚亂的 RSS 版本0.90、0.91、0.92、0.93、0.94、1.0 和 2.0