明天的明天的明天

          用鍵盤改變生活

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            17 Posts :: 0 Stories :: 19 Comments :: 0 Trackbacks

          常用鏈接

          留言簿(6)

          我參與的團隊

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          生成高品質縮略圖算法。  
             
            import   java.awt.image.BufferedImage;  
             
            public   class   ImageScale   {  
            private   int   width;  
            private   int   height;  
            private   int   scaleWidth;  
            double   support   =   (double)   3.0;  
            double   PI   =   (double)   3.14159265358978;  
            double[]   contrib;  
            double[]   normContrib;  
            double[]   tmpContrib;  
            int   startContrib,   stopContrib;  
            int   nDots;  
            int   nHalfDots;  
             
            /**  
              *   Start:  
              *   Use   Lanczos   filter   to   replace   the   original   algorithm   for   image   scaling.   Lanczos   improves   quality   of   the   scaled   image  
              *   modify   by   :blade  
              *   */  
            public   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   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;  
             
            }   //   end   of   DetermineResultSize()  
             
            private   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);  
             
            }   //   end   of   Lanczos()  
             
            //  
            //       Assumption:   same   horizontal   and   vertical   scaling   factor  
            //  
            private   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];  
            }  
            }   //   end   of   CalContrib()  
             
            //處理邊緣  
            private   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;  
            }  
             
            }   //   end   of   CalTempContrib()  
             
            private   int   GetRedValue(int   rgbValue)   {  
            int   temp   =   rgbValue   &   0x00ff0000;  
            return   temp   >>   16;  
            }  
             
            private   int   GetGreenValue(int   rgbValue)   {  
            int   temp   =   rgbValue   &   0x0000ff00;  
            return   temp   >>   8;  
            }  
             
            private   int   GetBlueValue(int   rgbValue)   {  
            return   rgbValue   &   0x000000ff;  
            }  
             
            private   int   ComRGB(int   redValue,   int   greenValue,   int   blueValue)   {  
             
            return   (redValue   <<   16)   +   (greenValue   <<   8)   +   blueValue;  
            }  
             
            //行水平濾波  
            private   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;  
             
            }   //   end   of   HorizontalFilter()  
             
            //圖片水平濾波  
            private   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;  
             
            }   //   end   of   HorizontalFiltering()  
             
            private   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];  
            //     System.out.println(valueRed+"->"+Clip((int)valueRed)+"<-");  
            //  
            //     System.out.println(valueGreen+"->"+Clip((int)valueGreen)+"<-");  
            //     System.out.println(valueBlue+"->"+Clip((int)valueBlue)+"<-"+"-->");  
            }  
             
            valueRGB   =   ComRGB(Clip((int)   valueRed),   Clip((int)   valueGreen),  
            Clip((int)   valueBlue));  
            //       System.out.println(valueRGB);  
            return   valueRGB;  
             
            }   //   end   of   VerticalFilter()  
             
            private   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;  
             
            }   //   end   of   VerticalFiltering()  
             
            int   Clip(int   x)   {  
            if   (x   <   0)  
            return   0;  
            if   (x   >   255)  
            return   255;  
            return   x;  
            }  
             
            /**  
              *   End:  
              *   Use   Lanczos   filter   to   replace   the   original   algorithm   for   image   scaling.   Lanczos   improves   quality   of   the   scaled   image  
              *   modify   by   :blade  
              *   */  
             
             
            }  
          posted on 2007-09-17 12:53 Endless 閱讀(1211) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 绥宁县| 腾冲县| 涟水县| 嘉兴市| 沁水县| 景泰县| 义乌市| 天峨县| 县级市| 扎兰屯市| 常宁市| 尉氏县| 龙州县| 富顺县| 巴青县| 钟山县| 金乡县| 德清县| 嘉义市| 吉木萨尔县| 姜堰市| 库伦旗| 元谋县| 全南县| 霍城县| 齐齐哈尔市| 东至县| 富源县| 柏乡县| 沾化县| 商南县| 新巴尔虎左旗| 城市| 林州市| 嘉义县| 株洲市| 天等县| 铜梁县| 芦山县| 佛坪县| 昭平县|