【问题标题】:How to resize the buffered image n graphics 2d in java?如何在java中调整bufferedimage n graphics2d的大小?
【发布时间】:2011-01-21 07:05:27
【问题描述】:
int width = 175;
Graphics2D gb = (Graphics2D) g;

        bufferedimage = (BufferedImage) createImage(width, width);

        Graphics2D graphics = bufferedimage.createGraphics();
        graphics.setColor(/*this.getBackground()*/Color.red);
        graphics.fillRect(0, 0, width, width);

您好,我有大尺寸的缓冲...我必须调整缓冲图像的大小...请您帮帮我吗?

【问题讨论】:

    标签: java image bufferedimage


    【解决方案1】:
    public BufferedImage scaleImage(BufferedImage img, int width, int height,
            Color background) {
        int imgWidth = img.getWidth();
        int imgHeight = img.getHeight();
        if (imgWidth*height < imgHeight*width) {
            width = imgWidth*height/imgHeight;
        } else {
            height = imgHeight*width/imgWidth;
        }
        BufferedImage newImage = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_RGB);
        Graphics2D g = newImage.createGraphics();
        try {
            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                    RenderingHints.VALUE_INTERPOLATION_BICUBIC);
            g.setBackground(background);
            g.clearRect(0, 0, width, height);
            g.drawImage(img, 0, 0, width, height, null);
        } finally {
            g.dispose();
        }
        return newImage;
    }
    

    更新:不同的算法

    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.RenderingHints;
    import java.awt.image.BufferedImage;
    
    public enum Resizer {
        NEAREST_NEIGHBOR {
            @Override
            public BufferedImage resize(BufferedImage source,
                    int width, int height) {
                return commonResize(source, width, height,
                        RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
            }
        },
        BILINEAR {
            @Override
            public BufferedImage resize(BufferedImage source,
                    int width, int height) {
                return commonResize(source, width, height,
                        RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            }
        },
        BICUBIC {
            @Override
            public BufferedImage resize(BufferedImage source,
                    int width, int height) {
                return commonResize(source, width, height,
                        RenderingHints.VALUE_INTERPOLATION_BICUBIC);
            }
        },
        PROGRESSIVE_BILINEAR {
            @Override
            public BufferedImage resize(BufferedImage source,
                    int width, int height) {
                return progressiveResize(source, width, height,
                        RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            }
        },
        PROGRESSIVE_BICUBIC {
            @Override
            public BufferedImage resize(BufferedImage source,
                    int width, int height) {
                return progressiveResize(source, width, height,
                        RenderingHints.VALUE_INTERPOLATION_BICUBIC);
            }
        },
        AVERAGE {
            @Override
            public BufferedImage resize(BufferedImage source,
                    int width, int height) {
                Image img2 = source.getScaledInstance(width, height,
                        Image.SCALE_AREA_AVERAGING);
                BufferedImage img = new BufferedImage(width, height,
                        source.getType());
                Graphics2D g = img.createGraphics();
                try {
                    g.drawImage(img2, 0, 0, width, height, null);
                } finally {
                    g.dispose();
                }
                return img;
            }
        };
    
        public abstract BufferedImage resize(BufferedImage source,
                int width, int height);
    
        private static BufferedImage progressiveResize(BufferedImage source,
                int width, int height, Object hint) {
            int w = Math.max(source.getWidth()/2, width);
            int h = Math.max(source.getHeight()/2, height);
            BufferedImage img = commonResize(source, w, h, hint);
            while (w != width || h != height) {
                BufferedImage prev = img;
                w = Math.max(w/2, width);
                h = Math.max(h/2, height);
                img = commonResize(prev, w, h, hint);
                prev.flush();
            }
            return img;
        }
    
        private static BufferedImage commonResize(BufferedImage source,
                int width, int height, Object hint) {
            BufferedImage img = new BufferedImage(width, height,
                    source.getType());
            Graphics2D g = img.createGraphics();
            try {
                g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, hint);
                g.drawImage(source, 0, 0, width, height, null);
            } finally {
                g.dispose();
            }
            return img;
        }
    };
    

    【讨论】:

    • 是的,我怀疑它是否真的使用双三次插值。我已经测试了几种算法(见上面的更新)。如果认为质量/时间比最好的是 PROGRESSIVE_BILINEAR。
    • 这是不同选项的快速列表。
    猜你喜欢
    • 2014-03-30
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    • 2013-02-05
    相关资源
    最近更新 更多