posts - 431,  comments - 344,  trackbacks - 0

          如果給出縮略圖的寬度和高度,那么就會根據給出的寬度和高度生產縮略圖,如果只給出寬度或者高度值,那么就會根據比例生成縮略圖。
          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 周銳 閱讀(979) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 仙游县| 连云港市| 中超| 寿宁县| 阜阳市| 岢岚县| 子洲县| 泗洪县| 哈巴河县| 来凤县| 澎湖县| 杭锦后旗| 老河口市| 肇州县| 长岛县| 平南县| 紫金县| 庆城县| 贵州省| 曲水县| 固原市| 夏河县| 筠连县| 衡南县| 漳州市| 平原县| 宁城县| 林周县| 蓬莱市| 女性| 汉川市| 旌德县| 乳源| 米林县| 锡林浩特市| 翁牛特旗| 巴南区| 贵定县| 屏东县| 兴安盟| 永嘉县|