Question

I am doing this for a project at school, in which much more functionality will be added later, but I am having trouble getting the basic setup done.

I tried doing this in C++ initially, but decided to switch to Java after reading some documentation on BufferedImage, but I am running into an issue with output. Essentially this is what I am designing the flow of the program to be: 1) Extract original image's (BMP image that is supplied in grayscale) grayscale values. 2) Create a currentImage variable to preserve the original image and perform the modifications to the image I intend to perform in the later stages of the project. 3) Create a reusable output method that will take the currentImage BufferedImage, and output it to a panel (and maybe a file as well.

Here is what I have so far, which currently results in nothing being outputted to the screen, and when I tried doing System logs, it is not setting the pixel values in my draw mechanism:

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.awt.image.Raster;
import java.io.File;
import java.io.IOException;

@SuppressWarnings("serial")
public class ImageDriver extends JFrame {
    DrawPanel paintPanel;
    static int width = 1024, height = 768;

    BufferedImage originalImage, currentImage;
    File theImageFile;
    int[][] imageData;

    public ImageDriver() {
        super("Image Processing");
        setSize(width, height);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        paintPanel = new DrawPanel(width, height);
        add(paintPanel);
    }

    public void updateImageDisplay() {
        System.out.println("In updateImageDisplay!");
        paintPanel.setImage(currentImage);
    }


    public void readImage() {
        try {
            theImageFile = new File("images/img1.bmp");
            originalImage = ImageIO.read(theImageFile);
            currentImage = originalImage;
        } 
        catch (IOException e) {
            e.printStackTrace();
        }

        //get a raster to extract grayscale values
        Raster image_raster = currentImage.getData();

        //get pixel by pixel
        int[] pixel = new int[1];
        int[] buffer = new int[1];

        imageData = new int[image_raster.getWidth()][image_raster.getHeight()];

        for(int i = 0 ; i < image_raster.getWidth() ; i++)
            for(int j = 0 ; j < image_raster.getHeight() ; j++) {
                pixel = image_raster.getPixel(i, j, buffer);
                imageData[i][j] = pixel[0];
                //System.out.println("Pixel at: " + i + " x " + j + ": " + imageData[i][j]);
            }
    }

    public void increaseContrast() {

    }

    public static void main(String[] args) {
        ImageDriver driver = new ImageDriver();
        driver.setVisible(true);

        driver.readImage();
        driver.updateImageDisplay();

        driver.increaseContrast();
        driver.updateImageDisplay();
    }

    class DrawPanel extends JPanel {

        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);

        public DrawPanel(int width, int height) {
            setPreferredSize(new Dimension(width, height));
        }

        public void setImage(BufferedImage image) {
            System.out.println("In setImage!");
            this.image = image;

            repaint();
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            System.out.println("in paintPanel component!");

            g = image.getGraphics();
            g.drawImage(image, 0, 0, null);
        }
    }

}

I have a hunch that it is because I am declaring image in my DrawPanel to be an empty image at first, and setImage is not properly copying over all of its contents upon assignment. I tried fiddling around with using this:

this.image.setData(image.getData());

but to no avail.

I missing something here? Or is a complete re-write if the mechanism in order?

Thank you for reading.

Was it helpful?

Solution

The first thing that jumps out at me is this (in your paintComponent method)...

g = image.getGraphics();
g.drawImage(image, 0, 0, null);

Basically, you are painting the image back to itself, instead you should do something like like...

g.drawImage(image, 0, 0, this);

Using the Graphics context you were passed

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top