专栏首页简单就是美!写了一个实用的图像放大缩小程序,但是动画GIF转换后不会显示了,只有第一帧

写了一个实用的图像放大缩小程序,但是动画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;

/**
 * 一个实用的图像放大缩小程序
 * 
 * @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();
		if(logger.isInfoEnabled())
		{
			logger.info("ReaderMIMETypes:" + Arrays.asList(readerMIMETypes));
			logger.info("WriterMIMETypes:" + Arrays.asList(writerMIMETypes));
		}
	}

	/**
	 * 校验图像文件的格式是否可以进行缩放
	 * 
	 * @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));
	}
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • File 类详解

    1、路径分隔符 ; 2、名称分隔符 / (windows) \ (linux 等)

    帅飞
  • String 详解以及内存分析

    Java 字符串就是 Unicode 字符序列,例如串 “Java” 就是 4 个 Unicode 字符 J,a,v,a 组成的。

    帅飞
  • Leetcode: ZigZag Conversion

    这道题目做完貌似所有的Easy级别的题目就做完了,开始Medium的题目!加油吧!

    TheOneGIS
  • Object 类和垃圾回收机制

    如果在类的声明中未使用 extends 关键字指明其基类,则默认基类为 Object 类

    帅飞
  • Java 时间处理

    在标准 Java 类库中包含一个 Date 类。它的对象表示一个特定的瞬间,精确到毫秒。

    帅飞
  • 深克隆和浅克隆

    Java 集合中提供的拷贝构造函数只支持浅拷贝而不是深拷贝,这是因为集合中的拷贝构造函数是通过引用的复制来达到浅拷贝的。这意味着存储在原有集合和克隆集合中的对象...

    帅飞
  • Java 的方法和运算符

    方法是类和对象动态行为特征的抽象。方法很类似于面向过程中的函数。面向过程中,函数是最基本单位,整个程序有一个个函数调用组成;面向对象中,整个程序的基本单位是类,...

    帅飞
  • 你不知道的面向对象和面向过程之间的关系

    面向过程的思维模式是简单的线性思维 ,思考问题首先陷入第一步做什么、第二步做什么的细节中。这种思维模式适合处理简单的事情,比如:上厕所。

    帅飞
  • Java 中的链表分析

    我们平时都经常遇到容器这个词,那么 Java 集合中的容器指的是什么呢?容器就是利用某种特定的数据结构来存储数据的。在研究 Java 集合源码中时,我发现理解容...

    帅飞
  • IO 流最全讲解

    流 : 流动 、流向 从一端移动到另一端(源头与目的地) 程序 与 文件|数组|网络连接|数据库,以程序为中心

    帅飞

扫码关注云+社区

领取腾讯云代金券