posts - 431,  comments - 344,  trackbacks - 0
          公告
           Don't Repeat Yourself
          座右銘:you can lose your money, you can spent all of it, and if you work hard you get it all back. But if you waste your time, you're never gonna get it back.
          公告本博客在此聲明部分文章為轉摘,只做資料收集使用。


          微信: szhourui
          QQ:109450684
          Email
          lsi.zhourui@gmail.com
          <2011年7月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          留言簿(15)

          隨筆分類(1019)

          文章分類(3)

          文章檔案(21)

          收藏夾

          Link

          好友博客

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 863089
          • 排名 - 44

          最新評論

          閱讀排行榜

          如果給出縮略圖的寬度和高度,那么就會根據給出的寬度和高度生產縮略圖,如果只給出寬度或者高度值,那么就會根據比例生成縮略圖。
          package com.founder.common.utils;

          import java.awt.image.BufferedImage;
          import java.io.File;
          import javax.imageio.ImageIO;

          //生成等比例高質量縮略圖
          public class ThumbnailUtil {
           private static int width;
           private static int height;
           private static int scaleWidth;
           static double support = (double) 3.0;
           static double PI = (double) 3.14159265358978;
           static double[] contrib;
           static double[] normContrib;
           static double[] tmpContrib;
           static int startContrib, stopContrib;
           static int nDots;
           static int nHalfDots;

           public static void saveImage(String fromFileStr, String saveToFileStr, int formatWidth, int formatHeight) throws Exception {
            File saveFile = new File(saveToFileStr);
            File fromFile = new File(fromFileStr);
            saveImage(fromFile, saveFile, formatWidth, formatHeight);
           }
           
           public static void saveImage(File fromFile  , File saveFile, int formatWidth, int formatHeight) throws Exception {
            BufferedImage srcImage;
            srcImage = javax.imageio.ImageIO.read(fromFile); // construct image
            int imageWidth = srcImage.getWidth(null);
            int imageHeight = srcImage.getHeight(null);
            int changeToWidth = 0;
            int changeToHeight = 0;
            if (formatWidth > 0 && formatHeight > 0) {
             changeToWidth = formatWidth;
             changeToHeight = formatHeight;
            } else {
             if (imageWidth > 0 && imageHeight > 0) {
              if (imageWidth / imageHeight >= formatWidth / formatHeight) {
               if (imageWidth > formatWidth) {
                changeToWidth = formatWidth;
                changeToHeight = (imageHeight * formatWidth) / imageWidth;
               } else {
                changeToWidth = imageWidth;
                changeToHeight = imageHeight;
               }
              } else {
               if (imageHeight > formatHeight) {
                changeToHeight = formatHeight;
                changeToWidth = (imageWidth * formatHeight) / imageHeight;
               } else {
                changeToWidth = imageWidth;
                changeToHeight = imageHeight;
               }
              }
             }
            }
            
            srcImage = imageZoomOut(srcImage, changeToWidth, changeToHeight);
            ImageIO.write(srcImage, "JPEG", saveFile);
           }

           public static BufferedImage imageZoomOut(BufferedImage srcBufferImage, int w, int h) {
            width = srcBufferImage.getWidth();
            height = srcBufferImage.getHeight();
            scaleWidth = w;

            if (DetermineResultSize(w, h) == 1) {
             return srcBufferImage;
            }
            CalContrib();
            BufferedImage pbOut = HorizontalFiltering(srcBufferImage, w);
            BufferedImage pbFinalOut = VerticalFiltering(pbOut, h);
            return pbFinalOut;
           }

           /**
            * 決定圖像尺寸
            */
           private static int DetermineResultSize(int w, int h) {
            double scaleH, scaleV;
            scaleH = (double) w / (double) width;
            scaleV = (double) h / (double) height;
            // 需要判斷一下scaleH,scaleV,不做放大操作
            if (scaleH >= 1.0 && scaleV >= 1.0) {
             return 1;
            }
            return 0;

           }

           private static double Lanczos(int i, int inWidth, int outWidth, double Support) {
            double x;

            x = (double) i * (double) outWidth / (double) inWidth;

            return Math.sin(x * PI) / (x * PI) * Math.sin(x * PI / Support)
              / (x * PI / Support);

           }

           private static void CalContrib() {
            nHalfDots = (int) ((double) width * support / (double) scaleWidth);
            nDots = nHalfDots * 2 + 1;
            try {
             contrib = new double[nDots];
             normContrib = new double[nDots];
             tmpContrib = new double[nDots];
            } catch (Exception e) {
             System.out.println("init contrib,normContrib,tmpContrib" + e);
            }

            int center = nHalfDots;
            contrib[center] = 1.0;

            double weight = 0.0;
            int i = 0;
            for (i = 1; i <= center; i++) {
             contrib[center + i] = Lanczos(i, width, scaleWidth, support);
             weight += contrib[center + i];
            }

            for (i = center - 1; i >= 0; i--) {
             contrib[i] = contrib[center * 2 - i];
            }

            weight = weight * 2 + 1.0;

            for (i = 0; i <= center; i++) {
             normContrib[i] = contrib[i] / weight;
            }

            for (i = center + 1; i < nDots; i++) {
             normContrib[i] = normContrib[center * 2 - i];
            }
           }

           // 處理邊緣
           private static void CalTempContrib(int start, int stop) {
            double weight = 0;

            int i = 0;
            for (i = start; i <= stop; i++) {
             weight += contrib[i];
            }

            for (i = start; i <= stop; i++) {
             tmpContrib[i] = contrib[i] / weight;
            }

           }

           private static int GetRedValue(int rgbValue) {
            int temp = rgbValue & 0x00ff0000;
            return temp >> 16;
           }

           private static int GetGreenValue(int rgbValue) {
            int temp = rgbValue & 0x0000ff00;
            return temp >> 8;
           }

           private static int GetBlueValue(int rgbValue) {
            return rgbValue & 0x000000ff;
           }

           private static int ComRGB(int redValue, int greenValue, int blueValue) {

            return (redValue << 16) + (greenValue << 8) + blueValue;
           }

           // 行水平濾波
           private static int HorizontalFilter(BufferedImage bufImg, int startX, int stopX,
             int start, int stop, int y, double[] pContrib) {
            double valueRed = 0.0;
            double valueGreen = 0.0;
            double valueBlue = 0.0;
            int valueRGB = 0;
            int i, j;

            for (i = startX, j = start; i <= stopX; i++, j++) {
             valueRGB = bufImg.getRGB(i, y);

             valueRed += GetRedValue(valueRGB) * pContrib[j];
             valueGreen += GetGreenValue(valueRGB) * pContrib[j];
             valueBlue += GetBlueValue(valueRGB) * pContrib[j];
            }

            valueRGB = ComRGB(Clip((int) valueRed), Clip((int) valueGreen),
              Clip((int) valueBlue));
            return valueRGB;

           }

           // 圖片水平濾波
           private static BufferedImage HorizontalFiltering(BufferedImage bufImage, int iOutW) {
            int dwInW = bufImage.getWidth();
            int dwInH = bufImage.getHeight();
            int value = 0;
            BufferedImage pbOut = new BufferedImage(iOutW, dwInH,
              BufferedImage.TYPE_INT_RGB);

            for (int x = 0; x < iOutW; x++) {

             int startX;
             int start;
             int X = (int) (((double) x) * ((double) dwInW) / ((double) iOutW) + 0.5);
             int y = 0;

             startX = X - nHalfDots;
             if (startX < 0) {
              startX = 0;
              start = nHalfDots - X;
             } else {
              start = 0;
             }

             int stop;
             int stopX = X + nHalfDots;
             if (stopX > (dwInW - 1)) {
              stopX = dwInW - 1;
              stop = nHalfDots + (dwInW - 1 - X);
             } else {
              stop = nHalfDots * 2;
             }

             if (start > 0 || stop < nDots - 1) {
              CalTempContrib(start, stop);
              for (y = 0; y < dwInH; y++) {
               value = HorizontalFilter(bufImage, startX, stopX, start,
                 stop, y, tmpContrib);
               pbOut.setRGB(x, y, value);
              }
             } else {
              for (y = 0; y < dwInH; y++) {
               value = HorizontalFilter(bufImage, startX, stopX, start,
                 stop, y, normContrib);
               pbOut.setRGB(x, y, value);
              }
             }
            }

            return pbOut;

           }

           private static int VerticalFilter(BufferedImage pbInImage, int startY, int stopY,
             int start, int stop, int x, double[] pContrib) {
            double valueRed = 0.0;
            double valueGreen = 0.0;
            double valueBlue = 0.0;
            int valueRGB = 0;
            int i, j;

            for (i = startY, j = start; i <= stopY; i++, j++) {
             valueRGB = pbInImage.getRGB(x, i);

             valueRed += GetRedValue(valueRGB) * pContrib[j];
             valueGreen += GetGreenValue(valueRGB) * pContrib[j];
             valueBlue += GetBlueValue(valueRGB) * pContrib[j];
            }

            valueRGB = ComRGB(Clip((int) valueRed), Clip((int) valueGreen), Clip((int) valueBlue));
            
            return valueRGB;

           }

           private static BufferedImage VerticalFiltering(BufferedImage pbImage, int iOutH) {
            int iW = pbImage.getWidth();
            int iH = pbImage.getHeight();
            int value = 0;
            BufferedImage pbOut = new BufferedImage(iW, iOutH,
              BufferedImage.TYPE_INT_RGB);

            for (int y = 0; y < iOutH; y++) {

             int startY;
             int start;
             int Y = (int) (((double) y) * ((double) iH) / ((double) iOutH) + 0.5);

             startY = Y - nHalfDots;
             if (startY < 0) {
              startY = 0;
              start = nHalfDots - Y;
             } else {
              start = 0;
             }

             int stop;
             int stopY = Y + nHalfDots;
             if (stopY > (int) (iH - 1)) {
              stopY = iH - 1;
              stop = nHalfDots + (iH - 1 - Y);
             } else {
              stop = nHalfDots * 2;
             }

             if (start > 0 || stop < nDots - 1) {
              CalTempContrib(start, stop);
              for (int x = 0; x < iW; x++) {
               value = VerticalFilter(pbImage, startY, stopY, start, stop,
                 x, tmpContrib);
               pbOut.setRGB(x, y, value);
              }
             } else {
              for (int x = 0; x < iW; x++) {
               value = VerticalFilter(pbImage, startY, stopY, start, stop,
                 x, normContrib);
               pbOut.setRGB(x, y, value);
              }
             }

            }

            return pbOut;

           }

           static int Clip(int x) {
            if (x < 0)
             return 0;
            if (x > 255)
             return 255;
            return x;
           }
          }

          posted on 2011-07-26 09:49 周銳 閱讀(991) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 弥渡县| 武威市| 阿瓦提县| 保靖县| 云霄县| 仁布县| 嵩明县| 农安县| 唐河县| 扎赉特旗| 长泰县| 从化市| 科技| 池州市| 上杭县| 怀远县| 林甸县| 朝阳市| 抚顺市| 桑日县| 新田县| 万安县| 大同县| 墨竹工卡县| 临夏市| 松潘县| 广丰县| 台东县| 喜德县| 文水县| 施秉县| 四子王旗| 南雄市| 陵水| 舞钢市| 阿合奇县| 鸡东县| 金华市| 柳州市| 南部县| 连南|