• <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
            當(dāng)圖片縮小到原圖的一半以下時(shí),bilinear的效果就不好了,再小下去,bicubic的也不夠好,最好的效果是area_average算法,但是這個(gè)需要花太多的時(shí)間,可以使用改進(jìn)過的bilinear算法,效果跟area average差不多,速度在bilinear和bicubic之間,但是當(dāng)圖片非常大,綻放到非常小時(shí),花的時(shí)間比bicubic多得多,但是比area average少得多,效果與area average差不多,還是不錯(cuò)的

            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. 

                // 縮小圖片,縮小時(shí)可以使用改進(jìn)過的bilinear, bicubic插值算法

                // 但是轉(zhuǎn)換透明圖片時(shí)如果使用單緩沖區(qū)會出問題,這時(shí)每次都要?jiǎng)?chuàng)建一個(gè)緩沖區(qū)才可以

                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 逛奔的蝸牛 閱讀(4244) 評論(0)  編輯 收藏 引用 所屬分類: Java
            一本久久知道综合久久| 欧美久久综合九色综合| 99国产精品久久| 成人久久久观看免费毛片| 2020最新久久久视精品爱| 中文字幕精品无码久久久久久3D日动漫 | 人妻精品久久久久中文字幕 | 中文字幕乱码久久午夜| 久久精品亚洲日本波多野结衣| 久久av免费天堂小草播放| 久久综合给合综合久久| 久久精品亚洲一区二区三区浴池 | 久久国产香蕉视频| 久久综合给合久久狠狠狠97色| 国产午夜精品理论片久久| 亚洲精品无码久久毛片| 国产精品一区二区久久不卡| 亚洲欧美另类日本久久国产真实乱对白 | 久久www免费人成看国产片| 亚洲国产精品无码久久久蜜芽 | 国产免费福利体检区久久| 久久婷婷五月综合97色一本一本| 成人精品一区二区久久久| 色综合久久综合中文综合网| 久久婷婷五月综合色99啪ak| 91精品国产色综久久| 久久91精品国产91久久户| 久久精品国产久精国产思思 | 久久av免费天堂小草播放| 成人国内精品久久久久影院| 久久人人爽人人爽人人片av高请 | 久久一区二区免费播放| 国产精品久久久久久久午夜片 | 精品多毛少妇人妻AV免费久久| 久久精品不卡| 久久久久九九精品影院| 久久黄色视频| 亚洲欧美日韩久久精品| 久久精品国产久精国产一老狼| 久久精品卫校国产小美女| 国产成人精品综合久久久久|