Heap Space lors d'un redimensionnement de BufferedImage à partir d'une image TIFF
Bonjour,
Voilà mon problème :
Dans le cadre d'un module de scan (acquisition de documents par un scanner), je souhaite afficher une série de vignettes (aperçus d'image) dans un panel... Pour ce faire, je redimensionne l'image de base (acquise en bufferedImage) grace à la méthode drawimage de Graphics2D.
Jusqu'ici, tout se passe bien avec tous les types d'images (jpeg, png,...), sauf les images TIFF (simple ou multi-page, peu importe, le problème est le même) !
Voici le cheminement qui amène l'erreur :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
/**
* Méthode de création de la vignette
*/
private void initVignette(File file) {
BufferedImage image = null;
try {
if (FileUtils.getExtension(file).equalsIgnoreCase("tif") || FileUtils.getExtension(file).equalsIgnoreCase("tiff")) {
// -- Cas d'un fichier TIFF
image = ScanUtils.readTIFF(file, m_pageNumber - 1);
} else {
image = ImageIO.read(file);
}
final int imgWidth = image.getWidth();
final int imgHeight = image.getHeight();
if (imgWidth == -1 || imgHeight == -1) {
// -- l'image n'a pas fini de charger
return;
}
// -- Format Portrait ou paysage
if (imgWidth < imgHeight) {
int tmp = m_defaultWidth;
setDefaultWidth(m_defaultHeight);
setDefaultHeight(tmp);
}
m_vignette = new BufferedImage(m_defaultWidth, m_defaultHeight + 15, image.getType());
Graphics2D g2 = m_vignette.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
g2.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_SPEED);
g2.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING,
RenderingHints.VALUE_COLOR_RENDER_SPEED);
g2.setRenderingHint(RenderingHints.KEY_DITHERING,
RenderingHints.VALUE_DITHER_DISABLE);
// -- Redimensionnement
g2.drawImage(image, 0, 0, m_defaultWidth, m_defaultHeight, null);
setVignetteText(g2);
g2.dispose();
} catch (IOException e) {
s_logger.fatal(e.getMessage(), e);
}
/**
* Méthode de ScanUtils pour lire une image à partir d'un fichier TIFF et de son numéro de page
*/
public static BufferedImage readTIFF(File file, int numPage) {
BufferedImage result = null;
try {
FileSeekableStream stream = new FileSeekableStream(file);
TIFFDecodeParam paramd = new TIFFDecodeParam();
ImageDecoder decoder = ImageCodec.createImageDecoder("TIFF", stream, paramd);
RenderedImageAdapter ria = new RenderedImageAdapter(decoder.decodeAsRenderedImage(numPage));
result = ria.getAsBufferedImage();
} catch (IOException e) {
//TODO : MC : I18n
s_logger.error(e.getMessage(), e);
}
return result;
} |
m_defaultWidth et m_defaultHeight sont des int respectivement fixés à 160 et 120.
L'erreur se produit systématiquement à la ligne (de la méthode setVignette()) :
Code:
g2.drawImage(image, 0, 0, m_defaultWidth, m_defaultHeight, null);
Avec un Java Heap Space...
Quelqu'un aurait-il une idée lumineuse ?