zhenghao111
8/9/2012 - 4:23 AM

java:更快更好地缩放图象

java:更快更好地缩放图象

 protected void paintComponent(Graphics g) {
        // Scale with NEAREST_NEIGHBOR
        int xLoc = PADDING, yLoc = PADDING;
        long startTime, endTime;
        float totalTime;
        int iterations = 10;
        ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_INTERPOLATION, 
                RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
        startTime = System.nanoTime();
        for (int i = 0; i < iterations; ++i) {
            g.drawImage(picture, xLoc, yLoc, scaleW, scaleH, null);
        }
        endTime = System.nanoTime();
        totalTime = (float)((endTime - startTime) / 1000000) / iterations;
        g.drawString("NEAREST ", xLoc, yLoc + scaleH + PADDING);
        g.drawString(Float.toString(totalTime) + " ms", 
                xLoc, yLoc + scaleH + PADDING + 10);
        System.out.println("NEAREST: " + ((endTime - startTime) / 1000000));
        
        // Scale with BILINEAR
        xLoc += scaleW + PADDING;
        ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_INTERPOLATION, 
                RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        startTime = System.nanoTime();
        for (int i = 0; i < iterations; ++i) {
            g.drawImage(picture, xLoc, yLoc, scaleW, scaleH, null);
        }
        endTime = System.nanoTime();
        totalTime = (float)((endTime - startTime) / 1000000) / iterations;
        g.drawString("BILINEAR", xLoc, yLoc + scaleH + PADDING);
        g.drawString(Float.toString(totalTime) + " ms", 
                xLoc, yLoc + scaleH + PADDING + 10);
        System.out.println("BILINEAR: " + ((endTime - startTime) / 1000000));

        // Scale with BICUBIC
        xLoc += scaleW + PADDING;
        ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_INTERPOLATION, 
                RenderingHints.VALUE_INTERPOLATION_BICUBIC);
        startTime = System.nanoTime();
        for (int i = 0; i < iterations; ++i) {
            g.drawImage(picture, xLoc, yLoc, scaleW, scaleH, null);
        }
        endTime = System.nanoTime();
        totalTime = (float)((endTime - startTime) / 1000000) / iterations;
        g.drawString("BICUBIC", xLoc, yLoc + scaleH + PADDING);
        g.drawString(Float.toString(totalTime) + " ms", 
                xLoc, yLoc + scaleH + PADDING + 10);
        System.out.println("BICUBIC: " + ((endTime - startTime) / 1000000));

        // Scale with getScaledInstance
        xLoc += scaleW + PADDING;
        startTime = System.nanoTime();
        for (int i = 0; i < iterations; ++i) {
            Image scaledPicture = picture.getScaledInstance(scaleW, scaleH, 
                    Image.SCALE_AREA_AVERAGING);
            g.drawImage(scaledPicture, xLoc, yLoc, null);
        }
        endTime = System.nanoTime();
        totalTime = (float)((endTime - startTime) / 1000000) / iterations;
        g.drawString("getScaled", xLoc, yLoc + scaleH + PADDING);
        g.drawString(Float.toString(totalTime) + " ms", 
                xLoc, yLoc + scaleH + PADDING + 10);
        System.out.println("getScaled: " + ((endTime - startTime) / 1000000));
        
        // Scale with Progressive Bilinear
        xLoc += scaleW + PADDING;
        startTime = System.nanoTime();
        for (int i = 0; i < iterations; ++i) {
            Image scaledPicture = getFasterScaledInstance(picture, scaleW, scaleH, 
                    RenderingHints.VALUE_INTERPOLATION_BILINEAR, true);
            g.drawImage(scaledPicture, xLoc, yLoc, null);
        }
        endTime = System.nanoTime();
        totalTime = (float)((endTime - startTime) / 1000000) / iterations;
        g.drawString("Progressive", xLoc, yLoc + scaleH + PADDING);
        g.drawString(Float.toString(totalTime) + " ms", 
                xLoc, yLoc + scaleH + PADDING + 10);
        System.out.println("Progressive: " + ((endTime - startTime) / 1000000));
    }