0

In Java is there any way to get a BufferedImage of a File that isn't a .jpeg, .gif, .bmp, or .png? More specifically, I would like to be able to create a BufferedImage .jpg. The only way I know of is ImageIO.read, which will return null if the file isn't of any of these types. Is there any other way to make a BufferedImage? Currently my code looks like this:

private void sendImage(BufferedImage image){

    try{
        if(output == null){

            showMessage("MAKE SURE THAT YOU ARE CONNECTED TO SOMEONE!\n");

        }

        else{

            if(image == null)System.out.println("image is null in sendImage");

            output.writeObject("CODE - 4");
            output.flush();
            System.out.println("here");
            output.writeObject(image);
            System.out.println("done");
            output.flush();
            System.out.println("Just sent code " + 4);

        }

    }catch(IOException ioException){

        System.out.println("\nERROR! UNABLE TO SEND IMAGE CODE!");
        ioException.printStackTrace();

    }

And the stack trace looks like this:

java.io.NotSerializableException: java.awt.image.BufferedImage
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1183)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
    at server.Server.sendImage(Server.java:432)
    at server.Server.access$300(Server.java:32)
    at server.Server$2.actionPerformed(Server.java:95)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6516)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
    at java.awt.Component.processEvent(Component.java:6281)
    at java.awt.Container.processEvent(Container.java:2229)
    at java.awt.Component.dispatchEventImpl(Component.java:4872)
    at java.awt.Container.dispatchEventImpl(Container.java:2287)
    at java.awt.Component.dispatchEvent(Component.java:4698)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
    at java.awt.Container.dispatchEventImpl(Container.java:2273)
    at java.awt.Window.dispatchEventImpl(Window.java:2719)
    at java.awt.Component.dispatchEvent(Component.java:4698)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:747)
    at java.awt.EventQueue.access$300(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:706)
    at java.awt.EventQueue$3.run(EventQueue.java:704)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.awt.EventQueue$4.run(EventQueue.java:720)
    at java.awt.EventQueue$4.run(EventQueue.java:718)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:717)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

And yes, the program outputs "here" then crashes with the above stack trace. If there isn't any to get it in a different format, is there an alternative that can be from an image of any format (and for SUPER BONUS POINTS, a serializable one too).

dsiegler19
  • 369
  • 1
  • 5
  • 20

2 Answers2

1

The most common readers/writers of images in Java are:

  • javax.imageio, particularly if you add the Twelve Monkeys project jars.
  • Java Advanced Imaging, but it seems to have a memory leak sometimes.
  • BioFormat, specialized in all the microscopy formats, but also the regular ones.

With both imageio and JAI, you can read/write jpg images.

FiReTiTi
  • 5,597
  • 12
  • 30
  • 58
0

I don't think you want to write your image directly to the stream like that. What you want is ImageIO.write, like this:

import javax.imageio.ImageIO;
.
.
.
.
ImageIO.write(image, "png", output);

The above code will write your buffered image out as a png. If you want a jpeg, this should work:

ImageIO.write(image, "jpg", output);
Zeki
  • 5,107
  • 1
  • 20
  • 27