import java.awt.Shape;\r
import java.awt.geom.AffineTransform;\r
import java.awt.geom.Rectangle2D;\r
+import java.awt.image.AffineTransformOp;\r
import java.awt.image.BufferedImage;\r
import java.awt.image.RescaleOp;\r
import java.io.ByteArrayInputStream;\r
return bi;\r
}\r
\r
-\r
- /**\r
- * @return the buffered image\r
- */\r
+ @Override\r
public BufferedImage getImage() {\r
return img;\r
}\r
\r
+ @Override\r
+ public BufferedImage getImage(Dimension dim) {\r
+ double w_old = img.getWidth();\r
+ double h_old = img.getHeight();\r
+ BufferedImage scaled = new BufferedImage((int)w_old, (int)h_old, BufferedImage.TYPE_INT_ARGB);\r
+ double w_new = dim.getWidth();\r
+ double h_new = dim.getHeight();\r
+ AffineTransform at = new AffineTransform();\r
+ at.scale(w_new/w_old, h_new/h_old);\r
+ AffineTransformOp scaleOp = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR);\r
+ scaleOp.filter(img, scaled);\r
+ return scaled;\r
+ }\r
+\r
@Override\r
public Dimension getDimension() {\r
return (img == null)\r
package org.apache.poi.sl.draw;\r
\r
import java.awt.Color;\r
+import java.awt.Dimension;\r
import java.awt.Graphics2D;\r
import java.awt.LinearGradientPaint;\r
import java.awt.MultipleGradientPaint.ColorSpaceType;\r
renderer.setAlpha(alpha/100000.f);\r
}\r
\r
- BufferedImage image = renderer.getImage();\r
+ Rectangle2D textAnchor = shape.getAnchor();\r
+ BufferedImage image;\r
+ if ("image/x-wmf".equals(fill.getContentType())) {\r
+ // don't rely on wmf dimensions, use dimension of anchor\r
+ // TODO: check pixels vs. points for image dimension \r
+ image = renderer.getImage(new Dimension((int)textAnchor.getWidth(), (int)textAnchor.getHeight()));\r
+ } else {\r
+ image = renderer.getImage();\r
+ }\r
+\r
if(image == null) {\r
LOG.log(POILogger.ERROR, "Can't load image data");\r
return null;\r
}\r
- Rectangle2D textAnchor = shape.getAnchor();\r
Paint paint = new java.awt.TexturePaint(image, textAnchor);\r
\r
return paint;\r
\r
presets.put(cusName, new CustomGeometry(cusGeom));\r
}\r
+ \r
+ staxFiltRd.close();\r
+ staxReader.close();\r
} catch (Exception e) {\r
throw new RuntimeException("Unable to load preset geometries.", e);\r
} finally {\r
*/\r
package org.apache.poi.sl.draw;\r
\r
-import java.awt.*;\r
-import java.awt.geom.AffineTransform;\r
+import java.awt.Dimension;\r
+import java.awt.Graphics2D;\r
+import java.awt.Insets;\r
import java.awt.geom.Rectangle2D;\r
import java.awt.image.BufferedImage;\r
-import java.awt.image.RescaleOp;\r
-import java.io.*;\r
-\r
-import javax.imageio.ImageIO;\r
-\r
-import org.apache.poi.util.POILogFactory;\r
-import org.apache.poi.util.POILogger;\r
+import java.io.IOException;\r
+import java.io.InputStream;\r
\r
/**\r
* Classes can implement this interfaces to support other formats, for\r
* @return the image as buffered image\r
*/\r
BufferedImage getImage();\r
+\r
+ /**\r
+ * @param dim the dimension in pixels of the returned image\r
+ * @return the image as buffered image\r
+ * \r
+ * @since POI 3.15-beta2\r
+ */\r
+ BufferedImage getImage(Dimension dim);\r
\r
/**\r
* Render picture data into the supplied graphics\r
File outfile = new File(outdir, outname);\r
ImageIO.write(img, format, outfile);\r
}\r
+ \r
+ graphics.dispose();\r
+ img.flush();\r
}\r
} finally {\r
ss.close();\r
\r
@Override\r
public BufferedImage getImage() {\r
+ return getImage(getDimension());\r
+ }\r
+\r
+ @Override\r
+ public BufferedImage getImage(Dimension dim) {\r
if (image == null) {\r
return new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); \r
}\r
\r
- Dimension dim = getDimension();\r
BufferedImage bufImg = new BufferedImage((int)dim.getWidth(), (int)dim.getHeight(), BufferedImage.TYPE_INT_ARGB);\r
Graphics2D g = bufImg.createGraphics();\r
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);\r
g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);\r
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);\r
g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);\r
- image.draw(g);\r
+ image.draw(g, new Rectangle2D.Double(0,0,dim.getWidth(),dim.getHeight()));\r
g.dispose();\r
\r
if (alpha != 0) {\r
\r
return bufImg;\r
}\r
-\r
+ \r
@Override\r
public boolean drawImage(Graphics2D graphics, Rectangle2D anchor) {\r
return drawImage(graphics, anchor, null);\r