204
技術社區[雲棲]
寫了一個實用的圖像放大縮小程序,但是動畫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
上一篇:
Windows下的tail一二三:tail、BareTail、WinTail
下一篇:
讓人眼花繚亂的 RSS 版本0.90、0.91、0.92、0.93、0.94、1.0 和 2.0
雲服務器和虛擬主機有什麼區別
socket通信——多角度控製LED燈亮滅
android 簡單列表對話框(AlertDialog.Builder().setItems())
AKKA文檔(java)——術語,概念
關於CLR內存管理一些深層次的討論[上篇]
java 扁平化企業網站源碼模版 屏幕自適應 springmvc SSM 生成靜態化
我的作品《iPhone與iPad開發實戰—iOS經典應用剖析》--以及源碼下載地址
Neutron總結-OpenStack中的網絡隔離
[數據庫]數據庫臨時表
《Servlet、JSP和Spring MVC初學指南》——1.4 ServletRequest