Open GoogleCodeExporter opened 9 years ago
Hello there,
Thank you taking the time to submit this report.
This is an issue caused by an improper usage of the
`FileInputStream`/`InputStream`.
(Although I haven't had the chance to actually run the code, you can see my
reasoning below.)
The `FileInputStream` outside of the `for` loop. This will cause the
`InputStream` to be read to the end of the file on the first iteration of the
`for` loop, and on the second iteration, the stream is already at the end of
the file, so there's no image data to read.
The exception thrown by Thumbnailator is caused by the `BufferedImage` returned
by the `ImageIO.read` method being `null`. This occurs, as the stream is at the
end of file, which means there's no data beyond that point. Since there's no
data, there's no appropriate `ImageReader` that can be used to read the image,
therefore, the `read` method returns `null`. You can verify this line of
reasoning by reading the documentation for the `read` method:
http://docs.oracle.com/javase/7/docs/api/javax/imageio/ImageIO.html#read%28java.io.InputStream%29
The `ImageIO.read` method does not make any assumptions about where the image
is, so it will not automatically go back to the beginning of the stream to find
image data -- and this is appropriate behavior. Imagine a case where the source
file actually is a binary blob containing images and other data, and the
`ImageIO.read` method is given a precisely-positioned `InputStream` as its
source; in that case it would be inappropriate for the `ImageIO.read` method to
perform any marker changes to the `InputStream`.
Bottom line is, it's up to the programmer to provide a properly prepared
`InputStream` to a consumer of the `InputStream`. (At least, I believe that
would be the assumption if not specified otherwise.)
To fix your test code, move the line that is instantiating your
`FileInputStream` from the source `File` object to *inside* the `for` loop, and
don't forget to close the `FileInputStream` before the end of the `for` loop,
just so you release any resources that may be left open.
---
That said, there should be better `null` checking for the `Thumbnails.of`
methods so that this kind of problem can be detected earlier rather than after
going deeper into the Thumbnailator infrastructure, so that the stack trace can
be simplified and to return better exception messages.
Original comment by coobird...@gmail.com
on 23 Dec 2014 at 6:25
Thumbnails.of(BufferedImage...)
Thank you very much. I'll have a try.
Original comment by pcman.zh...@gmail.com
on 25 Dec 2014 at 9:33
Original issue reported on code.google.com by
pcman.zh...@gmail.com
on 23 Dec 2014 at 2:25