-
Bug
-
Resolution: Cannot Reproduce
-
P4
-
5.0, 8, 9
-
x86
-
windows_xp
FULL PRODUCT VERSION :
java version "1.5.0_07"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_07-b03)
Java HotSpot(TM) Client VM (build 1.5.0_07-b03, mixed mode)
AND
java version "1.6.0-beta2"
Java(TM) SE Runtime Environment (build 1.6.0-beta2-b85)
Java HotSpot(TM) Client VM (build 1.6.0-beta2-b85, mixed mode, sharing)
ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows XP [Version 5.1.2600]
A DESCRIPTION OF THE PROBLEM :
Trying to read into a pre-created BufferedImage makes the BMP reader fail with a NPE
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Run the attached test code, passing the path to a BMP file as the command-line argument
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The image file should be read into the BufferedImage provided as it is when reading a JPEG image.
ACTUAL -
NullPointerException
ERROR MESSAGES/STACK TRACES THAT OCCUR :
Exception in thread "main" java.lang.NullPointerException
at javax.imageio.stream.ImageInputStreamImpl.readFully(Unknown Source)
at com.sun.imageio.plugins.bmp.BMPImageReader.read24Bit(Unknown Source)
at com.sun.imageio.plugins.bmp.BMPImageReader.read(Unknown Source)
at ImageIoBug.main(ImageIoBug.java:52)
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Iterator;
import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.FileImageInputStream;
/*
* Created on 25-May-2006
*
*/
public class ImageIoBug
{
/**
* @param args
* the path to an image file use a .BMP to fail.
*/
public static void main(String[] args) throws Exception
{
BufferedImage testImage = null;
if (args.length > 0)
{
String path = args[0];
String ext = path.substring(path.lastIndexOf('.') + 1);
System.out.println("Readers claiming to handle this format:");
for (Iterator<ImageReader> ri = ImageIO.getImageReaders(new FileImageInputStream(new File(path))); ri.hasNext();)
System.out.println(" " + ri.next().getClass().getCanonicalName());
Iterator readerIt = ImageIO.getImageReadersBySuffix(ext);
if (readerIt.hasNext())
{
// This code fails for BMP files
System.out.println("Using reader for \"" + ext + "\" suffix");
ImageReader reader = (ImageReader) readerIt.next();
System.out.println(reader.getClass().getCanonicalName());
reader.setInput(new FileImageInputStream(new File(path)));
int width = reader.getWidth(0);
int height = reader.getHeight(0);
System.out.printf("Image is %d x %d\n", width, height);
testImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
ImageReadParam param = new ImageReadParam();
// Setting the destination image makes the BMP reader fail!
if (true) // Change to false to see that the .BMP file CAN be read
param.setDestination(testImage);
// this method will throw some exceptions not mentioned in
// the Java docs
reader.read(0, param);
}
}
else
{
System.out.println("Usage: java ImageIoBug <bitmap_file>");
}
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Copy the image into a new image after reading...
testImage = ImageIO.read(new File(path));
// But I need the image data to be in INT_BGR form
if (testImage != null && testImage.getType() != BufferedImage.TYPE_INT_BGR)
{
BufferedImage testDest = new BufferedImage(
testImage.getWidth(),
testImage.getHeight(),
BufferedImage.TYPE_INT_BGR);
Graphics g = testDest.getGraphics();
g.drawImage(testImage, 0, 0, null);
g.dispose();
testImage = testDest;
}
java version "1.5.0_07"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_07-b03)
Java HotSpot(TM) Client VM (build 1.5.0_07-b03, mixed mode)
AND
java version "1.6.0-beta2"
Java(TM) SE Runtime Environment (build 1.6.0-beta2-b85)
Java HotSpot(TM) Client VM (build 1.6.0-beta2-b85, mixed mode, sharing)
ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows XP [Version 5.1.2600]
A DESCRIPTION OF THE PROBLEM :
Trying to read into a pre-created BufferedImage makes the BMP reader fail with a NPE
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Run the attached test code, passing the path to a BMP file as the command-line argument
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The image file should be read into the BufferedImage provided as it is when reading a JPEG image.
ACTUAL -
NullPointerException
ERROR MESSAGES/STACK TRACES THAT OCCUR :
Exception in thread "main" java.lang.NullPointerException
at javax.imageio.stream.ImageInputStreamImpl.readFully(Unknown Source)
at com.sun.imageio.plugins.bmp.BMPImageReader.read24Bit(Unknown Source)
at com.sun.imageio.plugins.bmp.BMPImageReader.read(Unknown Source)
at ImageIoBug.main(ImageIoBug.java:52)
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Iterator;
import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.FileImageInputStream;
/*
* Created on 25-May-2006
*
*/
public class ImageIoBug
{
/**
* @param args
* the path to an image file use a .BMP to fail.
*/
public static void main(String[] args) throws Exception
{
BufferedImage testImage = null;
if (args.length > 0)
{
String path = args[0];
String ext = path.substring(path.lastIndexOf('.') + 1);
System.out.println("Readers claiming to handle this format:");
for (Iterator<ImageReader> ri = ImageIO.getImageReaders(new FileImageInputStream(new File(path))); ri.hasNext();)
System.out.println(" " + ri.next().getClass().getCanonicalName());
Iterator readerIt = ImageIO.getImageReadersBySuffix(ext);
if (readerIt.hasNext())
{
// This code fails for BMP files
System.out.println("Using reader for \"" + ext + "\" suffix");
ImageReader reader = (ImageReader) readerIt.next();
System.out.println(reader.getClass().getCanonicalName());
reader.setInput(new FileImageInputStream(new File(path)));
int width = reader.getWidth(0);
int height = reader.getHeight(0);
System.out.printf("Image is %d x %d\n", width, height);
testImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
ImageReadParam param = new ImageReadParam();
// Setting the destination image makes the BMP reader fail!
if (true) // Change to false to see that the .BMP file CAN be read
param.setDestination(testImage);
// this method will throw some exceptions not mentioned in
// the Java docs
reader.read(0, param);
}
}
else
{
System.out.println("Usage: java ImageIoBug <bitmap_file>");
}
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Copy the image into a new image after reading...
testImage = ImageIO.read(new File(path));
// But I need the image data to be in INT_BGR form
if (testImage != null && testImage.getType() != BufferedImage.TYPE_INT_BGR)
{
BufferedImage testDest = new BufferedImage(
testImage.getWidth(),
testImage.getHeight(),
BufferedImage.TYPE_INT_BGR);
Graphics g = testDest.getGraphics();
g.drawImage(testImage, 0, 0, null);
g.dispose();
testImage = testDest;
}
- duplicates
-
JDK-8154352 ImageReadParam.setDestination(wrong) results in assortment of failures
- Open
- relates to
-
JDK-4893377 ImageReader.read does not throw IIOException when destination is incompatible
- Closed