javaimagejpegjavax.imageio

Unable to read JPEG image using ImageIO.read(File file)


I'm having problems reading this one JPEG file using ImageIO.read(File file) - it throws an exception with the message "Unsupported Image Type".

I have tried other JPEG images, and they seem to work fine.

The only differance I've been able to spot is that this file seems to include a thumbnail - is that known to cause problems with ImageIO.read()?

Troublesome image

EDIT:

Added the resulting image:

Strange colors


Solution

  • Your image "Color Model" is CMYK, JPEGImageReader (the inner class that reads your file) reads only RGB Color Model.

    If you need to read CMYK images, then you will need to convert them, try this code.

    UPDATE

    Read a CMYK image into RGB BufferedImage.

        File f = new File("/path/imagefile.jpg");
        
        //Find a suitable ImageReader
        Iterator readers = ImageIO.getImageReadersByFormatName("JPEG");
        ImageReader reader = null;
        while(readers.hasNext()) {
            reader = (ImageReader)readers.next();
            if(reader.canReadRaster()) {
                break;
            }
        }
        
        //Stream the image file (the original CMYK image)
        ImageInputStream input =   ImageIO.createImageInputStream(f); 
        reader.setInput(input); 
        
        //Read the image raster
        Raster raster = reader.readRaster(0, null); 
          
        //Create a new RGB image
        BufferedImage bi = new BufferedImage(raster.getWidth(), raster.getHeight(), 
        BufferedImage.TYPE_4BYTE_ABGR); 
        
        //Fill the new image with the old raster
        bi.getRaster().setRect(raster);
    

    UPDATE - March 2015 - Adding simulation images

    Original images were removed from OP's dropbox. So I'm adding new images (not the originals) that simulates the problem that was happening with them.

    First image is how a normal RGB image looks like.

    Image RGB

    Second image is how the same image will look like in CMYK color model.

    You cannot actually see how it looks on the web because it will be converted to RGB by the host. To see exactly how it looks, take the RGB image and run it through an RGB to CMYK converter.

    Third image is how the CMYK image will look like when read then written using Java ImageIO.

    Image CMYK read through Java RGB

    The problem that was happening with OP is they had something like image 2 which throws an exception when you try to read it.