• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            逛奔的蝸牛

            我不聰明,但我會很努力

               ::  :: 新隨筆 ::  ::  :: 管理 ::
            1. Bilinear
            2. BiCubic
            3. Area_Average
            4. Progressive Bilinear
            當圖片縮小到原圖的一半以下時,bilinear的效果就不好了,再小下去,bicubic的也不夠好,最好的效果是area_average算法,但是這個需要花太多的時間,可以使用改進過的bilinear算法,效果跟area average差不多,速度在bilinear和bicubic之間,但是當圖片非常大,綻放到非常小時,花的時間比bicubic多得多,但是比area average少得多,效果與area average差不多,還是不錯的

            Progressive Bilinear Scaling

            We know that a significant problem with the quality of the bilinear approach occurs when the downscale is by more than 50 percent. So what if we compen- sated for that problem by scaling iteratively toward the final size, scaling down by exactly 50 percent each time until the final iteration, when we scale by 50 percent or less? Then we would account for all of the pixels along the way that should figure into the final image. 

                // 縮小圖片,縮小時可以使用改進過的bilinear, bicubic插值算法

                // 但是轉換透明圖片時如果使用單緩沖區會出問題,這時每次都要創建一個緩沖區才可以

                public static BufferedImage getFasterDownScaledInstance(BufferedImage img,

                                                                        int targetWidth,

                                                                        int targetHeight,

                                                                        Object hint,

                                                                        boolean progressive) {

                    int type = (img.getTransparency() == Transparency.OPAQUE) ? BufferedImage.TYPE_INT_RGB

                            : BufferedImage.TYPE_INT_ARGB;

                    BufferedImage ret = (BufferedImage) img;

                    BufferedImage scratchImage = null;

                    Graphics2D g2d = null;

                    int w = 0, h = 0;

                    int prevW = ret.getWidth();

                    int prevH = ret.getHeight();


                    if (progressive) {

                        // Use multistep technique: start with original size,

                        // then scale down in multiple passes with drawImage()

                        // until the target size is reached

                        w = img.getWidth();

                        h = img.getHeight();

                    } else {

                        // Use one-step technique: scale directly from original

                        // size to target size with a single drawImage() call

                        w = targetWidth;

                        h = targetHeight;

                    }


                    do {

                        if (targetWidth < img.getWidth() && progressive && w > targetWidth) {

                            // 如果是縮小,寬縮小為原來的一半

                            w >>>= 1;

                            w = (w < targetWidth) ? targetWidth : w;

                        } else {

                            w = targetWidth;

                        }


                        if (targetHeight < img.getHeight() && progressive && h > targetHeight) {

                            // 如果是縮小,高縮小為原來的一半

                            h >>>= 1;

                            h = (h < targetHeight) ? targetHeight : h;

                        } else {

                            h = targetHeight;

                        }


                        if (scratchImage == null) {

                            // Use a single scratch buffer for all iterations

                            // and then copy to the final, correctly sized image before

                            // returning

                            scratchImage = new BufferedImage(w, h, type);

                            g2d = scratchImage.createGraphics();

                        } else if (type == BufferedImage.TYPE_INT_ARGB && scratchImage != null && g2d != null) {

                            // 透明圖片不能使用單緩存

                            g2d.dispose();

                            scratchImage = new BufferedImage(w, h, type);

                            g2d = scratchImage.createGraphics();

                        }


                        g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, hint);

                        g2d.drawImage(ret, 0, 0, w, h, 0, 0, prevW, prevH, null);

                        prevW = w;

                        prevH = h;

                        ret = scratchImage;

                    } while (w != targetWidth || h != targetHeight);


                    if (g2d != null) {

                        g2d.dispose();

                    }


                    // If we used a target size, the results into it

                    if (targetWidth != ret.getWidth() || targetHeight != ret.getHeight()) {

                        scratchImage = new BufferedImage(targetWidth, targetHeight, type);

                        g2d = scratchImage.createGraphics();

                        g2d.drawImage(ret, 0, 0, null);

                        g2d.dispose();

                        ret = scratchImage;

                    }

                    return ret;

                }

            posted on 2011-01-09 18:20 逛奔的蝸牛 閱讀(4267) 評論(0)  編輯 收藏 引用 所屬分類: Java
            久久国产成人午夜aⅴ影院| 久久中文精品无码中文字幕| 噜噜噜色噜噜噜久久| 中文成人久久久久影院免费观看| 亚洲AV伊人久久青青草原| 蜜桃麻豆WWW久久囤产精品| 亚洲av成人无码久久精品 | 精品国产乱码久久久久软件| 久久精品无码专区免费东京热| 青青青青久久精品国产h| 热久久视久久精品18| 久久被窝电影亚洲爽爽爽| 亚洲天堂久久久| 伊人久久综在合线亚洲2019| 99久久国产亚洲综合精品| 日本一区精品久久久久影院| 久久亚洲国产最新网站| 国产农村妇女毛片精品久久| 久久精品aⅴ无码中文字字幕不卡| 久久综合精品国产一区二区三区| 久久综合给合久久国产免费| 亚洲国产精品成人AV无码久久综合影院 | 国产成人精品久久亚洲高清不卡 | 亚洲а∨天堂久久精品9966| 99久久成人国产精品免费| 久久中文字幕精品| 久久综合视频网站| 欧美综合天天夜夜久久| 久久久精品2019免费观看| 亚洲欧美日韩久久精品第一区| 香蕉久久永久视频| 性欧美大战久久久久久久| 久久久久亚洲AV综合波多野结衣| 99久久无码一区人妻| 国产成人久久激情91| 久久91精品国产91久久小草| 久久精品午夜一区二区福利| 久久精品九九亚洲精品| 久久精品国产99久久久| 日韩精品久久久久久| 久久久久亚洲精品天堂久久久久久|