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

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

[code]
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));
}
}
[/code]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值