user3474719
user3474719

Reputation: 21

Resizing image in java - what do i need to change?

I was just wondering how I would resize an image in java? This is for an assignment where I have to locate an image and then save it as a .png file that is half the resolution as the original. This is my code so far;

enter code here

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class saveimage {

    public static void main(String[] args) // IOException
    {

        String sourceLocation;
        sourceLocation = (args[0]);

        int width = 963;
        int height = 640;
        int halfwidth = width / 2;
        int halfheight = height / 2;

        BufferedImage image1 = null;
        BufferedImage imagehalf = null;
        File readfile = null;

        try {
            readfile = new File(sourceLocation);
            image1 = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_ARGB);
            image1 = ImageIO.read(readfile);
            imagehalf = new BufferedImage(halfwidth, halfheight,
                    BufferedImage.TYPE_INT_ARGB);
            imagehalf = ImageIO.read(readfile);
            System.out.println("reading complete");
        }

        catch (IOException e) {
            System.out.println("Error: " + e);
        }
        try {
            readfile = new File("LOCATION OF FILE");
            ImageIO.write(image1, "png", readfile);
            System.out.println("Writing complete");
        } catch (IOException fail1) {
            System.out.println("Error:" + fail1);
        }
        try {
            readfile = new File "LOCATION OF OUTPUT"); 
            ImageIO.write(imagehalf, "png", readfile);
            System.out.println("writing half is complete");

        } catch (IOException fail2) {
            System.out.println("Error:" + fail2);
        }

    }

}

As you can see I have just halved the integer values at the start as I thought it would have just halved the output size but it didn't...is there anything i am doing wrong?

The next part of the assignment is that i need to tile the image but i am just doing one step at a time :)

Thanks in advance

Upvotes: 0

Views: 481

Answers (3)

Thomas
Thomas

Reputation: 88707

AFAIK imagehalf = ImageIO.read(readfile); would just read the image file and create a BufferedImage of the original size. What you're basically doing is create a fresh BufferedImage and then replace it with one read from the file, which can't work.

What you'd have to do instead: read the original image, create a half sized BufferedImage and draw the original image to the half sized one.

Use the getGraphics() method and call drawImage(...) with the necessary parameters on the returned Graphics object.

Note that you could use BufferedImage#getScaledInstance(...) but you might want to start using the Graphics object to be prepared for your future assignments.

Upvotes: 1

Mike K.
Mike K.

Reputation: 3789

You need to get a graphics context for the resizedImage and then draw the original image into it with the dimensions you want. Depending on how it looks you may want to look at Java's RenderingHints as well.

BufferedImage imageHalf = new BufferedImage(halfwidth, halfheight, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = imageHalf.createGraphics();
g.drawImage(fullImage, 0, 0, halfwidth, halfheight, null);
g.dispose();

Upvotes: 0

3kings
3kings

Reputation: 838

Hey feel free to use this code i posted below:

public ImageIcon resizeImage(ImageIcon imageIcon, int width, int height, boolean max) 
{
    Image image = imageIcon.getImage();
    Image newimg = image.getScaledInstance(-1, height, java.awt.Image.SCALE_SMOOTH);
    int width1 = newimg.getWidth(null);
    if ((max && width1 > width) || (!max && width1 < width))
        newimg = image.getScaledInstance(width, -1, java.awt.Image.SCALE_SMOOTH);
    return new ImageIcon(newimg);
}

I actually don't know what the boolean max does i found it on the internet somewhere.

Upvotes: -1

Related Questions