<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    數(shù)據(jù)加載中……
    很不錯(cuò)的一個(gè)生成等比例高質(zhì)量縮略圖的類(lèi)!
    import java.awt.image.BufferedImage;
    import java.io.File;
    import javax.imageio.ImageIO;

    //生成等比例高質(zhì)量縮略圖
    public class ScaleImage {
        
    private int width;

        
    private int height;

        
    private int scaleWidth;

        
    double support = (double3.0;

        
    double PI = (double3.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 static void main(String[] args) {
            ScaleImage is 
    = new ScaleImage();
            
    try {
                is.saveImageAsJpg(
    "F:/200712131421190.jpg""F:/21851500.jpg"160,
                        
    140);
            }
     catch (Exception e) {
                
    // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }


        
    // fromFileStr原圖片地址,saveToFileStr生成縮略圖地址,formatWideth生成圖片寬度,formatHeight高度
        public void saveImageAsJpg(String fromFileStr, String saveToFileStr,
                
    int formatWideth, int formatHeight) throws Exception {
            BufferedImage srcImage;
            File saveFile 
    = new File(saveToFileStr);
            File fromFile 
    = new File(fromFileStr);
            srcImage 
    = javax.imageio.ImageIO.read(fromFile); // construct image
            int imageWideth = srcImage.getWidth(null);
            
    int imageHeight = srcImage.getHeight(null);
            
    int changeToWideth = 0;
            
    int changeToHeight = 0;
            
    if (imageWideth > 0 && imageHeight > 0{
                
    // flag=true;
                if (imageWideth / imageHeight >= formatWideth / formatHeight) {
                    
    if (imageWideth > formatWideth) {
                        changeToWideth 
    = formatWideth;
                        changeToHeight 
    = (imageHeight * formatWideth) / imageWideth;
                    }
     else {
                        changeToWideth 
    = imageWideth;
                        changeToHeight 
    = imageHeight;
                    }

                }
     else {
                    
    if (imageHeight > formatHeight) {
                        changeToHeight 
    = formatHeight;
                        changeToWideth 
    = (imageWideth * formatHeight) / imageHeight;
                    }
     else {
                        changeToWideth 
    = imageWideth;
                        changeToHeight 
    = imageHeight;
                    }

                }

            }


            srcImage 
    = imageZoomOut(srcImage, changeToWideth, changeToHeight);
            ImageIO.write(srcImage, 
    "JPEG", saveFile);
        }


        
    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);

        }


        
    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;
        }

    }

    posted on 2007-12-13 21:57 davma 閱讀(1355) 評(píng)論(3)  編輯  收藏

    評(píng)論

    # re: 很不錯(cuò)的一個(gè)生成等比例高質(zhì)量縮略圖的類(lèi)! 2008-01-26 13:12 臭臭熊

    生成縮略圖時(shí),資源占用很大

    # re: 很不錯(cuò)的一個(gè)生成等比例高質(zhì)量縮略圖的類(lèi)! 2008-05-21 19:47 ys

    如何讀取水印內(nèi)容?

    # re: 很不錯(cuò)的一個(gè)生成等比例高質(zhì)量縮略圖的類(lèi)![未登錄](méi) 2010-09-06 15:18 ddd

    @ys
    laji

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲美女免费视频| jizz免费观看| 无人影院手机版在线观看免费| 亚洲国产一区二区a毛片| 免费无码H肉动漫在线观看麻豆| 国产精品亚洲mnbav网站| 产传媒61国产免费| 在线亚洲97se亚洲综合在线| 亚洲精品国产日韩无码AV永久免费网| 亚洲av中文无码| 全黄大全大色全免费大片| 亚洲一区二区影院| 曰批全过程免费视频网址| 亚洲综合久久一本伊伊区| 宅男666在线永久免费观看| 水蜜桃视频在线观看免费| 亚洲欧洲日产国码高潮αv| 成人影片一区免费观看| 久久亚洲AV成人出白浆无码国产| 91成人免费在线视频| 亚洲第一成年网站视频| 亚洲黄片手机免费观看| 成人网站免费看黄A站视频| 亚洲熟妇色自偷自拍另类| 女人18毛片水最多免费观看 | 亚洲人成在线影院| 黄色网址免费观看| 香蕉视频在线观看免费| 亚洲国产精品无码久久一线| 亚洲精品在线免费看| 99亚洲乱人伦aⅴ精品| 久久精品九九亚洲精品天堂| 美女视频黄的全免费视频网站| 国产精品亚洲а∨天堂2021| 亚洲AV无码成人精品区天堂| 妞干网免费视频在线观看| 亚洲精品国产日韩无码AV永久免费网| 亚洲综合激情视频| 亚洲综合另类小说色区色噜噜| 91免费国产精品| 免费一级毛片在线播放视频免费观看永久|