diff --git a/src/java/org/apache/poi/sl/draw/BitmapImageRenderer.java b/src/java/org/apache/poi/sl/draw/BitmapImageRenderer.java index 5099246e6..73e45d5db 100644 --- a/src/java/org/apache/poi/sl/draw/BitmapImageRenderer.java +++ b/src/java/org/apache/poi/sl/draw/BitmapImageRenderer.java @@ -24,6 +24,7 @@ import java.awt.Insets; import java.awt.Shape; import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; +import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; import java.awt.image.RescaleOp; import java.io.ByteArrayInputStream; @@ -69,14 +70,25 @@ public class BitmapImageRenderer implements ImageRenderer { return bi; } - - /** - * @return the buffered image - */ + @Override public BufferedImage getImage() { return img; } + @Override + public BufferedImage getImage(Dimension dim) { + double w_old = img.getWidth(); + double h_old = img.getHeight(); + BufferedImage scaled = new BufferedImage((int)w_old, (int)h_old, BufferedImage.TYPE_INT_ARGB); + double w_new = dim.getWidth(); + double h_new = dim.getHeight(); + AffineTransform at = new AffineTransform(); + at.scale(w_new/w_old, h_new/h_old); + AffineTransformOp scaleOp = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR); + scaleOp.filter(img, scaled); + return scaled; + } + @Override public Dimension getDimension() { return (img == null) diff --git a/src/java/org/apache/poi/sl/draw/DrawPaint.java b/src/java/org/apache/poi/sl/draw/DrawPaint.java index 7362a0e4a..2bebffc20 100644 --- a/src/java/org/apache/poi/sl/draw/DrawPaint.java +++ b/src/java/org/apache/poi/sl/draw/DrawPaint.java @@ -18,6 +18,7 @@ package org.apache.poi.sl.draw; import java.awt.Color; +import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.LinearGradientPaint; import java.awt.MultipleGradientPaint.ColorSpaceType; @@ -153,12 +154,20 @@ public class DrawPaint { renderer.setAlpha(alpha/100000.f); } - BufferedImage image = renderer.getImage(); + Rectangle2D textAnchor = shape.getAnchor(); + BufferedImage image; + if ("image/x-wmf".equals(fill.getContentType())) { + // don't rely on wmf dimensions, use dimension of anchor + // TODO: check pixels vs. points for image dimension + image = renderer.getImage(new Dimension((int)textAnchor.getWidth(), (int)textAnchor.getHeight())); + } else { + image = renderer.getImage(); + } + if(image == null) { LOG.log(POILogger.ERROR, "Can't load image data"); return null; } - Rectangle2D textAnchor = shape.getAnchor(); Paint paint = new java.awt.TexturePaint(image, textAnchor); return paint; diff --git a/src/java/org/apache/poi/sl/draw/DrawSimpleShape.java b/src/java/org/apache/poi/sl/draw/DrawSimpleShape.java index 720699666..748b691db 100644 --- a/src/java/org/apache/poi/sl/draw/DrawSimpleShape.java +++ b/src/java/org/apache/poi/sl/draw/DrawSimpleShape.java @@ -408,6 +408,9 @@ public class DrawSimpleShape extends DrawShape { presets.put(cusName, new CustomGeometry(cusGeom)); } + + staxFiltRd.close(); + staxReader.close(); } catch (Exception e) { throw new RuntimeException("Unable to load preset geometries.", e); } finally { diff --git a/src/java/org/apache/poi/sl/draw/ImageRenderer.java b/src/java/org/apache/poi/sl/draw/ImageRenderer.java index fed5d078c..6b8c49a14 100644 --- a/src/java/org/apache/poi/sl/draw/ImageRenderer.java +++ b/src/java/org/apache/poi/sl/draw/ImageRenderer.java @@ -18,17 +18,13 @@ */ package org.apache.poi.sl.draw; -import java.awt.*; -import java.awt.geom.AffineTransform; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.Insets; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; -import java.awt.image.RescaleOp; -import java.io.*; - -import javax.imageio.ImageIO; - -import org.apache.poi.util.POILogFactory; -import org.apache.poi.util.POILogger; +import java.io.IOException; +import java.io.InputStream; /** * Classes can implement this interfaces to support other formats, for @@ -109,6 +105,14 @@ public interface ImageRenderer { * @return the image as buffered image */ BufferedImage getImage(); + + /** + * @param dim the dimension in pixels of the returned image + * @return the image as buffered image + * + * @since POI 3.15-beta2 + */ + BufferedImage getImage(Dimension dim); /** * Render picture data into the supplied graphics diff --git a/src/ooxml/java/org/apache/poi/xslf/util/PPTX2PNG.java b/src/ooxml/java/org/apache/poi/xslf/util/PPTX2PNG.java index 7fb12eac8..83d944bf2 100644 --- a/src/ooxml/java/org/apache/poi/xslf/util/PPTX2PNG.java +++ b/src/ooxml/java/org/apache/poi/xslf/util/PPTX2PNG.java @@ -160,6 +160,9 @@ public class PPTX2PNG { File outfile = new File(outdir, outname); ImageIO.write(img, format, outfile); } + + graphics.dispose(); + img.flush(); } } finally { ss.close(); diff --git a/src/scratchpad/src/org/apache/poi/hwmf/draw/HwmfSLImageRenderer.java b/src/scratchpad/src/org/apache/poi/hwmf/draw/HwmfSLImageRenderer.java index ad6cacbdc..ab69ea6d5 100644 --- a/src/scratchpad/src/org/apache/poi/hwmf/draw/HwmfSLImageRenderer.java +++ b/src/scratchpad/src/org/apache/poi/hwmf/draw/HwmfSLImageRenderer.java @@ -72,18 +72,22 @@ public class HwmfSLImageRenderer implements ImageRenderer { @Override public BufferedImage getImage() { + return getImage(getDimension()); + } + + @Override + public BufferedImage getImage(Dimension dim) { if (image == null) { return new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); } - Dimension dim = getDimension(); BufferedImage bufImg = new BufferedImage((int)dim.getWidth(), (int)dim.getHeight(), BufferedImage.TYPE_INT_ARGB); Graphics2D g = bufImg.createGraphics(); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); - image.draw(g); + image.draw(g, new Rectangle2D.Double(0,0,dim.getWidth(),dim.getHeight())); g.dispose(); if (alpha != 0) { @@ -97,7 +101,7 @@ public class HwmfSLImageRenderer implements ImageRenderer { return bufImg; } - + @Override public boolean drawImage(Graphics2D graphics, Rectangle2D anchor) { return drawImage(graphics, anchor, null);