• <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 逛奔的蝸牛 閱讀(4263) 評論(0)  編輯 收藏 引用 所屬分類: Java
            亚洲日韩欧美一区久久久久我| 伊人久久久AV老熟妇色| 嫩草影院久久国产精品| 久久精品国产一区二区电影| 久久精品无码免费不卡| 国产成人精品综合久久久久| 国内精品久久久久久99| 久久久久久噜噜精品免费直播| 久久妇女高潮几次MBA| 亚洲午夜久久影院| 精品久久久久久国产| 国产精品狼人久久久久影院 | 粉嫩小泬无遮挡久久久久久| 99精品伊人久久久大香线蕉| 亚洲中文久久精品无码| 激情综合色综合久久综合| 久久丫精品国产亚洲av| 久久综合伊人77777| 色综合合久久天天综合绕视看| 久久亚洲精品国产亚洲老地址| 香港aa三级久久三级| 久久亚洲精品国产精品| 久久综合鬼色88久久精品综合自在自线噜噜| 久久久亚洲欧洲日产国码二区 | 久久亚洲精品国产精品婷婷| 国产精品9999久久久久| 一本一本久久a久久综合精品蜜桃| 99精品久久久久久久婷婷| 狠狠狠色丁香婷婷综合久久俺| 99精品久久精品一区二区| 日韩十八禁一区二区久久| 国内精品久久久久久中文字幕| 久久不射电影网| 久久精品国产亚洲网站| 久久91亚洲人成电影网站| 97久久精品无码一区二区天美| 日本久久久久亚洲中字幕| 亚洲国产精品一区二区久久hs| 亚洲精品国产字幕久久不卡| 精品综合久久久久久98| 新狼窝色AV性久久久久久|