前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >写了一个实用的图像放大缩小程序,但是动画GIF转换后不会显示了,只有第一帧

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

作者头像
阿敏总司令
发布2019-02-28 11:22:22
7260
发布2019-02-28 11:22:22
举报
文章被收录于专栏:简单就是美!

阅读更多

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

代码如下,有没做过GIF转换的,提提建议一下,谢谢。

代码语言:javascript
复制
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));
	}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2007-07-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档