0

The aim of this little project is to break down an image (in this case a flag) into pieces like a jigsaw and store each piece in part of a 2D array. I then want to be able to view each piece individually so that I know it has worked. I have created an object class which loads and stores the image. I created the object in my main class and then pass it to my splitImage method which divides the image into chunks and stores in the array. I would like to be able to view a section of the array to check that the splitImage method has worked correctly. Long term however I do need to view the array as I will be determining the colour of the pixel in each image piece and counting how many of each colour is in the image. When I run the current code I get the following in the console,

Exception in thread "main" java.lang.ClassCastException: sun.awt.image.ToolkitImage cannot be cast to java.awt.image.BufferedImage
    at sample.ImageFrame.splitImage(ImageFrame.java:28)
    at sample.ImageFrame.main(ImageFrame.java:59)

28 is the line - BufferedImage image = (BufferedImage)((Image) icon.getImage()); 59 is - ImageFrame.splitImage(imageSwing.label);

I have played around with these for some time, changing the position trying other options and have been unsuccessful. Help on this is much appreciated. Code is below and thanks in advance.

public class ImageSwing extends JFrame
{
   public JLabel label;

   public ImageSwing()
   {
      super("Test Image Array");
      setLayout(new FlowLayout());

      Icon flag = new ImageIcon(getClass().getResource("Italy_flag.jpg"));
      label = new JLabel(flag);
      label.setToolTipText("Italian Flag");
      add(label);
   }//main
}//class

public class ImageFrame
{
   //public ImageSwing imageSwing = new ImageSwing();
   //ImageSwing imageSwing = new ImageSwing();


   public static BufferedImage splitImage(JLabel i) throws IOException
   {
      //Holds the dimensions of image
      int rows = 4;
      int cols = 4;

      ImageIcon icon = (ImageIcon)i.getIcon();
      BufferedImage image = (BufferedImage)((Image) icon.getImage());

      int chunks = rows * cols;  //Total amount of image pieces

      int partWidth = i.getWidth() / cols; // determines the piece width
      int partHeight = i.getHeight() / rows; //determines the piece height
      int count = 0;

      BufferedImage[][] flagArray = new BufferedImage[rows][cols]; //2D Array to hold each image piece
      for (int x = 0; x < rows; x++)
      {
         for (int y = 0; y < cols; y++)
         {
            //Initialize the image array with image chunks
            flagArray[x][y] = new BufferedImage(partWidth, partHeight, image.getType());

            // draws the image chunk
            Graphics2D gr = flagArray[x][y].createGraphics();
            gr.drawImage(image, 0, 0, partWidth, partHeight, partWidth * y, partHeight * x, partWidth * y + partWidth, partHeight * x + partHeight, null);
            gr.dispose();
         }
      }
         return flagArray[rows][cols];
   }
   public static void main(String[] args)
   {

      ImageSwing imageSwing = new ImageSwing();

      try
      {
         ImageFrame.splitImage(imageSwing.label);
      } catch (IOException e)
      {
         e.printStackTrace();
      }

      imageSwing.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      imageSwing.setSize(260,180);
      imageSwing.setVisible(true);



   }//main
}//class
pajaja
  • 2,164
  • 4
  • 25
  • 33
TechCowboy
  • 51
  • 8

1 Answers1

1

Take a look at Java converting Image to BufferedImage
It provides a way to convert from Image to BufferedImage, which seems to be the problem.

Community
  • 1
  • 1
Andrew
  • 214
  • 2
  • 4