package li.pic.compress; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import javax.imageio.ImageIO; import li.pic.compress.Scalr.Mode; public class Demo { public static void main(String[] args) throws Exception { // File file = new File("C:/Users/li/Desktop/3_2.gif"); // FileInputStream fis = new FileInputStream(file); // BufferedImage bufferedImg = ImageIO.read(fis); // int imgWidth = bufferedImg.getWidth(); // int imgHeight = bufferedImg.getHeight(); // // System.out.println(imgHeight + "\t" + imgWidth); // System.out.println(getRate(new File("C:/Users/li/Desktop/1.gif"))); // System.out.println(getRate(new File("C:/Users/li/Desktop/2.gif"))); // System.out.println(getRate(new File("C:/Users/li/Desktop/3.gif"))); // System.out.println(getRate(new File("C:/Users/li/Desktop/3_2.gif"))); File src = new File("C:/Users/li/Desktop/1.gif"); File dest = new File("C:/Users/li/Desktop/1_2.gif"); Double rate = getRate(src); compress(src, dest, rate); System.out.println(rate + "\tdone"); } public static Double getRate(File file) throws Exception { Double ExpectedLength = (double) 245; Double rate = (double) 0; FileInputStream fis = new FileInputStream(file); BufferedImage bufferedImg = ImageIO.read(fis); Integer width = bufferedImg.getWidth(); Integer height = bufferedImg.getHeight(); Double length = (double) (width > height ? width : height); rate = ExpectedLength / length; fis.close(); return rate; } /** * 压缩一个gif图片 * * @param src 原图片 * @param dest 输出图片 * @param rate 压缩倍率 如 0.8 * @throws FileNotFoundException */ public static void compress(File src, File dest, Double rate) throws FileNotFoundException { GifDecoder gd = new GifDecoder(); int status = gd.read(new FileInputStream(src)); if (status != GifDecoder.STATUS_OK) { return; } AnimatedGifEncoder ge = new AnimatedGifEncoder(); ge.start(new FileOutputStream(dest)); ge.setRepeat(0); for (int i = 0; i < gd.getFrameCount(); i++) { BufferedImage frame = gd.getFrame(i); int width = frame.getWidth(); int height = frame.getHeight(); width = (int) (width * rate); height = (int) (height * rate); BufferedImage rescaled = Scalr.resize(frame, Mode.FIT_EXACT, width, height); int delay = gd.getDelay(i); ge.setDelay(delay); ge.addFrame(rescaled); } ge.finish(); } }