Search code examples
javaimageresizebufferedimagepaintcomponent

Rescale BufferedImage java


Hi i am looking for a way to rescale my image and still show the entire image, so it isn't cut in half or something like that. I am also not allowed to use libraries of any sort. Im drawing the image with paintcomponent.

Is there any way how to do this properly?

I've tried this one already :

BufferedImage image = null;

            try {
                image = ImageIO.read(new File($question.getMediaFile().getPath())); /* Get the image */

                Image scaled = image.getScaledInstance(350, 350, Image.SCALE_SMOOTH);

                g.drawImage(scaled, w-350, 200, null);
            } catch (IOException e) {
                e.printStackTrace();
            }

This resizes my image but doesn't show the entire image, i would like to rescale it to an image with 300*300 or 350*350 size or something like that.

Thanks!


Solution

  • Using the getScaledInstance() method works fine for me. Here's the code i was testing with:

    public class Resize {
        public static void main(String[] args) throws Exception {
            final Image logo = ImageIO.read(new URL("http://cdn.sstatic.net/stackexchange/img/logos/so/so-logo.png"));
            final Dimension dim = new Dimension(logo.getWidth(null), logo.getHeight(null));
            final JFrame frame = new JFrame();
            frame.add(new JPanel() {
                @Override
                public void paintComponent(Graphics g) {
                    super.paintComponent(g);
                    g.drawImage(logo.getScaledInstance(dim.width, dim.height, 0), 0, 0, this);
                }
            });
            final JSlider xSlider = new JSlider(JSlider.HORIZONTAL, 1, dim.width*3, dim.width);
            final JSlider ySlider = new JSlider(JSlider.VERTICAL, 1, dim.height*3, dim.height);
    
            ChangeListener cl = new ChangeListener() {
                @Override
                public void stateChanged(ChangeEvent e) {
                    dim.width = xSlider.getValue();
                    dim.height = ySlider.getValue();
                    frame.repaint();
                }
            };
            xSlider.addChangeListener(cl);
            ySlider.addChangeListener(cl);
    
            frame.add(xSlider, "South");
            frame.add(ySlider, "East");
    
            frame.setExtendedState(Frame.MAXIMIZED_BOTH);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.show();        
        }
    }