背景
最近有一個壓縮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();
}
}