posts - 1,comments - 0,trackbacks - 0
          //http://www.fmsware.com/stuff/gif.zip
          //先下程序中需要用到的包

          //class GifDD

          import image.AnimatedGifEncoder;
          import image.GifDecoder;

          import java.awt.image.BufferedImage;

          import java.io.FileNotFoundException;
          import java.io.FileOutputStream;
          import java.io.IOException;
          import java.util.HashMap;
          import java.util.Map;

          import javax.imageio.ImageIO;

          public class GifDD {

              public static String[] delay; // 延遲時間

              public Map<String, String> map = new HashMap<String, String>();

              /**
               * 把gif圖片按幀拆分成jpg圖片
               *
               * @param gifName
               *            String 原圖路徑
               *
               * @return BufferedImage[] 返回生成的文件流
               */

              private BufferedImage[] splitGif(String gifName) {

                  try {

                      GifDecoder decoder = new GifDecoder();

                      decoder.read(gifName);

                      // decoder.read(BufferedInputStream);

                      // decoder.read(InputStream);

                      int n = decoder.getFrameCount(); // 得到frame的個數

                      BufferedImage[] subPic = new BufferedImage[n]; //

                      delay = new String[n]; // 存儲延遲時間

                      for (int i = 0; i < n; i++) {

                          BufferedImage frame = decoder.getFrame(i); // 得到幀

                          delay[i] = decoder.getDelay(i) + ""; // 得到延遲時間

                          // 生成小的JPG文件
                          subPic[i] = frame;

                      }
                      return subPic;
                  } catch (Exception e) {
                      System.out.println("splitGif Failed!");
                      e.printStackTrace();
                      return null;
                  }
              }

              /**
               * 把多張jpg圖片合成一張
               *
               * @param bi
               *            BufferedImage[] 多個文件流文件名
               * @param newPic
               *            String 生成的gif文件名 包含路徑
               * @param _delay
               *            String[] 播放的時間
               */

              private void jpgToGif(BufferedImage bi[], String newPic, String _delay[]) {
                  try {

                      AnimatedGifEncoder e = new AnimatedGifEncoder(); // 網上可以找到此類

                      e.setRepeat(0);

                      e.start(newPic);

                      for (int i = 0; i < bi.length; i++) {

                          // src[i] = ImageIO.read(new File(pic[i])); // 讀入需要播放的jpg文件

                          // e.addFrame(src[i]); // 添加到幀中

                          e.setDelay(new Integer(_delay[i]));// 設置播放的延遲時間

                          e.addFrame(bi[i]);// 添加到幀中

                      }
                      e.finish();
                  } catch (Exception e) {
                      System.out.println("jpgToGif Failed:");
                      e.printStackTrace();
                  }
              }

              // 處理圖片

              /**
               * 把多張jpg圖片進行處理
               *
               * @param bi
               *            BufferedImage[] 多個文件流文件名
               * @param width
               *            String 縮放的寬度
               * @param height
               *            String 縮放的高度
               * @return BufferedImage[] 返回生成的文件流
               */

              public BufferedImage[] changeImage(BufferedImage[] bi, double width,
                      double height) {

                  BufferedImage src = null;

                  // 存width , height

                  int saveWidth = 0;

                  int saveHeight = 0;

                  BufferedImage[] backBi = new BufferedImage[bi.length];

                  for (int i = 0; i < bi.length; i++) {

                      double __width = new Double(bi[i].getWidth() + ""); // src width

                      double __height = new Double(bi[i].getHeight() + ""); // src
                      // height

                      if (bi[i].getHeight() <= width && bi[i].getWidth() <= height) {

                          saveWidth = new Double(width).intValue();

                          saveHeight = new Double(height).intValue();

                      }

                      else if ((width / height) >= (__width / __height)) {

                          saveWidth = new Double(__width / __height * height).intValue();

                          saveHeight = new Double(height).intValue();

                      } else {

                          saveHeight = new Double((__height / __width) * width)
                                  .intValue();

                          saveWidth = new Double(width).intValue();

                      }

                      BufferedImage tag = new BufferedImage(saveWidth, saveHeight,
                              BufferedImage.TYPE_INT_RGB);

                      // 繪制縮小后的圖

                      tag.getGraphics().drawImage(bi[i], 0, 0, saveWidth, saveHeight,
                              null); //

                      backBi[i] = tag;

                  }

                  // 繪制縮小后的圖

                  return backBi;

              }

              /**
               * 把多張jpg圖片進行存盤
               *
               * @param bi
               *            BufferedImage[] 多個文件流文件名
               * @param savePath
               *            String 存放的路徑
               *
               */
              public void saveImage(BufferedImage[] bi, String savePath) {

                  FileOutputStream out = null;

                  for (int i = 0; i < bi.length; i++) {

                      String path = savePath + "\\" + i + ".jpg";

                      try {

                          out = new FileOutputStream(path);

                          ImageIO.write(bi[i], "jpeg", out);// 存盤

                          // JPEGImageEncoder encoder =
                          // JPEGCodec.createJPEGEncoder(savePath);
                          //
                          // encoder.encode(bi[i]);

                          out.flush();

                          out.close();

                      } catch (FileNotFoundException e) {
                          // TODO Auto-generated catch block
                          e.printStackTrace();
                      } catch (IOException e) {
                          // TODO Auto-generated catch block
                          e.printStackTrace();
                      }

                  }

              }

              public static void main(String[] args) {

                  BufferedImage[] bi = new GifDD().splitGif("e:\\a.gif");

                  new GifDD().saveImage(bi, "e:\\");

                  BufferedImage[] backbi = new GifDD().changeImage(bi, 32, 32);

                  new GifDD().saveImage(backbi, "e:\\images");

                  new GifDD().jpgToGif(backbi, "e:\\_a.gif", delay);

              }
          }

          posted @ 2008-02-21 14:02 anly 閱讀(752) | 評論 (0)編輯 收藏
          僅列出標題  
          主站蜘蛛池模板: 建始县| 尉犁县| 黔南| 逊克县| 双柏县| 江陵县| 开鲁县| 荥经县| 鸡东县| 梧州市| 札达县| 玉田县| 延寿县| 磐石市| 泰和县| 昌乐县| 海宁市| 遂川县| 双江| 铁岭县| 宾阳县| 保靖县| 攀枝花市| 富宁县| 多伦县| 广灵县| 乌拉特前旗| 东乌| 望奎县| 石棉县| 四子王旗| 新郑市| 威海市| 兴义市| 靖州| 常山县| 衡南县| 会理县| 兴仁县| 承德县| 桐庐县|