Skip to content

Commit 929806b

Browse files
authored
fix: avoid OutOfMemoryError when computing image size
Use a `FileImageInputStream` instead of a `BufferedImage`.
1 parent 0b346fd commit 929806b

File tree

1 file changed

+10
-15
lines changed

1 file changed

+10
-15
lines changed

src/main/java/com/adobe/epubcheck/bitmap/BitmapChecker.java

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222

2323
package com.adobe.epubcheck.bitmap;
2424

25-
import java.awt.image.BufferedImage;
2625
import java.io.File;
2726
import java.io.FileOutputStream;
2827
import java.io.IOException;
@@ -31,6 +30,7 @@
3130

3231
import javax.imageio.ImageIO;
3332
import javax.imageio.ImageReader;
33+
import javax.imageio.stream.FileImageInputStream;
3434
import javax.imageio.stream.ImageInputStream;
3535

3636
import com.adobe.epubcheck.api.EPUBLocation;
@@ -119,6 +119,7 @@ public ImageHeuristics getImageSizes(String imgFileName) throws
119119
tempFile = getImageFile(ocf, imgFileName);
120120
String formatFromInputStream = null;
121121
String formatFromSuffix = null;
122+
ImageReader reader = null;
122123
ImageInputStream imageInputStream = ImageIO.createImageInputStream(tempFile);
123124
Iterator<ImageReader> imageReaderIteratorFromInputStream = ImageIO.getImageReaders(imageInputStream);
124125
while (imageReaderIteratorFromInputStream.hasNext()) {
@@ -127,7 +128,7 @@ public ImageHeuristics getImageSizes(String imgFileName) throws
127128

128129
Iterator<ImageReader> imageReaderIteratorFromSuffix = ImageIO.getImageReadersBySuffix(suffix);
129130
while (imageReaderIteratorFromSuffix.hasNext()) {
130-
ImageReader reader = imageReaderIteratorFromSuffix.next();
131+
reader = imageReaderIteratorFromSuffix.next();
131132
formatFromSuffix = reader.getFormatName();
132133

133134
if (formatFromSuffix != null && formatFromSuffix.equals(formatFromInputStream)) break;
@@ -138,20 +139,14 @@ public ImageHeuristics getImageSizes(String imgFileName) throws
138139

139140

140141

141-
if (formatFromSuffix != null && formatFromSuffix.equals(formatFromInputStream)) {
142+
if (formatFromSuffix != null && formatFromSuffix.equals(formatFromInputStream)) {
142143
// file format and file extension matches; read image file
143-
144-
try {
145-
BufferedImage image = ImageIO.read(tempFile);
146-
if (image == null) {
147-
report.message(MessageId.PKG_021, EPUBLocation.create(imgFileName));
148-
return null;
149-
150-
} else {
151-
int width = image.getWidth();
152-
int height = image.getHeight();
153-
return new ImageHeuristics(width, height, tempFile.length());
154-
}
144+
145+
try (ImageInputStream stream = new FileImageInputStream(tempFile)) {
146+
reader.setInput(stream);
147+
int width = reader.getWidth(reader.getMinIndex());
148+
int height = reader.getHeight(reader.getMinIndex());
149+
return new ImageHeuristics(width, height, tempFile.length());
155150
}
156151
catch (IOException e)
157152
{

0 commit comments

Comments
 (0)