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

简介: 写了一个实用的图像放大缩小程序,但是动画GIF转换后不会显示了,只有第一帧 代码如下,有没做过GIF转换的,提提建议一下,谢谢。  import java.awt.Canvas; import java.awt.Component; import java.awt.Graphics; import java.awt.Image; import java.awt.im

写了一个实用的图像放大缩小程序,但是动画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;
 
/**
  * 一个实用的图像放大缩小程序
  *
  * @author YuLimin
  */
public class ZoomImage
{
    private static final Logger logger = Logger.getLogger(ZoomImage. class );
    private static Component component = new Canvas();
    // ".pcx","tga",".tif" 这三种格式目前还不支持;
    // 这些定义的格式经过我测试过是可以支持的。
    private static String[] imageFormatArray = new String[]{ ".jpg" , ".jpeg" , ".gif" , ".png" , ".bmp" };
 
    /**
      * 测试用例
      *
      * @param args
      * @throws Exception
      */
    public static void main(String[] args) throws Exception
    {
       ZoomImage zoomImage = new ZoomImage();
       zoomImage.listFormt();

   // 缩小四倍  

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

   // 放大四倍  

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

    }
 
    /**
      * 查看图像 I/O 库所支持的图像格式有哪些格式
      */ 
    public void 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));
       }
    }
 
    /**
      * 校验图像文件的格式是否可以进行缩放
      *
      * @param fileName
      * @return
      */
    public boolean 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;
    }
 
    /**
      * 将目录下的所有图像进行放大缩小
      *
      * @param strDir 图像的目录
      * @param zoomRatio 放大缩小的倍率
      * @param rebuild 是否重新创建,即已经存在的图像是否覆盖重建
      * @throws Exception
      */
    public void 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 为缩小
      *
      * @param fileName
      * @param fileNameTarget
      * @param zoomRatio
      * @throws Exception
      */
    public void 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));
    }
}
 
相关文章
|
3月前
|
前端开发 JavaScript
前端必看的8个HTML+CSS技巧 (六) 裁剪图像的动画
前端必看的8个HTML+CSS技巧 (六) 裁剪图像的动画
|
6月前
[笔记]音视频学习之SDL篇《二》 绘制平铺的背景图并居中放置另一图片
[笔记]音视频学习之SDL篇《二》 绘制平铺的背景图并居中放置另一图片
|
4月前
[MFC] 将像素坐标点缩放,准确的画在所在控件的图片上
[MFC] 将像素坐标点缩放,准确的画在所在控件的图片上
38 0
|
7月前
|
C++ Python
C++ VS Open3D点云显示颜色渲染滤波
C++ VS Open3D点云显示颜色渲染滤波
97 0
|
8月前
|
人工智能
将 JPEG 和 PNG 位图转换为 SVG 矢量图,可无限放大
将 JPEG 和 PNG 位图转换为 SVG 矢量图,可无限放大
200 0
|
机器学习/深度学习 计算机视觉
【图片操作】提取GIF的图片帧
gif是我们日常生活中常用的一种图片,它介于视频和图片之间。我们可以用图片的内存体验到一些视频的感觉。但是有时候我们会想把gif的图片全部提取出来,今天我们就来实现一下这个操作。
328 0
|
API Android开发
【Android 内存优化】自定义组件长图组件 ( 获取图像宽高 | 计算解码区域 | 设置图像解码属性 复用 像素格式 | 图像绘制 )
【Android 内存优化】自定义组件长图组件 ( 获取图像宽高 | 计算解码区域 | 设置图像解码属性 复用 像素格式 | 图像绘制 )
138 0
【Android 内存优化】自定义组件长图组件 ( 获取图像宽高 | 计算解码区域 | 设置图像解码属性 复用 像素格式 | 图像绘制 )
|
前端开发 Android开发
【Android 应用开发】Paint 渲染 之 BitmapShader 位图渲染 ( 渲染流程 | CLAMP 拉伸最后像素 | REPEAT 重复绘制图片 | MIRROR 绘制反向图片 )(一)
【Android 应用开发】Paint 渲染 之 BitmapShader 位图渲染 ( 渲染流程 | CLAMP 拉伸最后像素 | REPEAT 重复绘制图片 | MIRROR 绘制反向图片 )(一)
365 0
|
Android开发
【Android 应用开发】Paint 渲染 之 BitmapShader 位图渲染 ( 渲染流程 | CLAMP 拉伸最后像素 | REPEAT 重复绘制图片 | MIRROR 绘制反向图片 )(二)
【Android 应用开发】Paint 渲染 之 BitmapShader 位图渲染 ( 渲染流程 | CLAMP 拉伸最后像素 | REPEAT 重复绘制图片 | MIRROR 绘制反向图片 )(二)
247 0
【Android 应用开发】Paint 渲染 之 BitmapShader 位图渲染 ( 渲染流程 | CLAMP 拉伸最后像素 | REPEAT 重复绘制图片 | MIRROR 绘制反向图片 )(二)
|
移动开发 计算机视觉 Python
把图片按照指定大小剪裁,不够的地方加黑边
1 # -*- coding: utf-8 -*- 2 3 import os 4 import sys 5 import numpy as np 6 import cv2 7 8 IMAGE_SIZE = 224 9 10 11 # 按照指定图像大小调整尺寸 12 de...
1215 0