java中截取gif的每一幀(支持截取透明元素)

背景

最近有一個壓縮gif圖片的需求,遇到了一些問題,
1.gif圖片的透明元素不好處理,變成白色或者黑色。
2.有透明元素的gif反而會變得更大,疑似透明元素處理不當的原因。
3.JDK對GIF的處理簡直弱爆了(也許是我沒找到吧)

最後成果
支持GIF的每一幀截取,包括透明元素,不會丟失透明元素。

注意事項
啊哈,最後還是沒有完成需求
1.包含透明元素的GIF圖片會變大很多,透明元素越多,生成的gif越大。
2.對於不包括透明元素的GIF圖片(或者透明元素很少的)處理得還是很OK的。
你覺得本文對你有用的話,可以繼續往下看

核心代碼
主要用到了GifDecoder和AnimatedGifEncoder兩個類
public static void main(String[] args) {
		long startTime=System.currentTimeMillis();
		try{
			GifDecoder gd = new GifDecoder();
			//要處理的圖片
			int status = gd.read(new FileInputStream(new File("E:/test/03/04.gif")));
			if (status != GifDecoder.STATUS_OK) {
				return;
			}
			//
			
			AnimatedGifEncoder ge = new AnimatedGifEncoder();
			
			//這裏是關鍵,設置要替換成透明的顏色
			ge.setTransparent(Color.WHITE);
			//
			ge.start(new FileOutputStream(new File("E:/test/03/out_04.gif")));
			ge.setRepeat(0);
			
			for (int i = 0; i < gd.getFrameCount(); i++) {
				//取得gif的每一幀
				BufferedImage frame = gd.getFrame(i);
				//你可以對每一幀做點什麼,比如縮放什麼的,這裏就什麼都不做了
				
				int width = frame.getWidth();
				int height = frame.getHeight();
				int delay = gd.getDelay(i);
				ge.setDelay(delay);
				ge.addFrame(frame);
				
			}
			//輸出圖片
			ge.finish();
			
			System.out.println(System.currentTimeMillis()-startTime);
		}catch(Exception e){
			e.printStackTrace();
		}
	}





源碼下載地址



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章