use of org.apache.batik.transcoder.image.ImageTranscoder in project mage by magefree.
the class SvgUtils method loadSVG.
/**
* Load svg file content as image
*
* @param svgFile content (can be resource or file)
* @param svgInfo info to show in logs or errors
* @param cssFileName css settings
* @param cssAdditionalSettings additional css settings (warning, if you change additional settings then css file must be re-created)
* @param resizeToWidth image size
* @param resizeToHeight image size
* @param useShadow draw image with shadow (not implemented)
* @return can return null on error (some linux systems can have compatibility problem with different java/svg libs)
* @throws IOException
*/
public static BufferedImage loadSVG(InputStream svgFile, String svgInfo, String cssFileName, String cssAdditionalSettings, int resizeToWidth, int resizeToHeight, boolean useShadow) throws IOException {
if (svgFile == null) {
throw new IllegalArgumentException("Empty svg data or unknown file");
}
// load SVG image
// base loader code: https://stackoverflow.com/questions/11435671/how-to-get-a-buffererimage-from-a-svg
// resize code: https://vibranttechie.wordpress.com/2015/05/15/svg-loading-to-javafx-stage-and-auto-scaling-when-stage-resize/
// TODO: implement shadow drawing
useShadow = false;
if (useShadow && ((resizeToWidth <= 0) || (resizeToHeight <= 0))) {
throw new IllegalArgumentException("Must use non zero sizes for shadow");
}
final BufferedImage[] imagePointer = new BufferedImage[1];
// css settings for svg
SvgUtils.prepareCss(cssFileName, cssAdditionalSettings, false);
File cssFile = new File(SvgUtils.getSvgTempFile(cssFileName));
TranscodingHints transcoderHints = new TranscodingHints();
// resize
int shadowX = 0;
int shadowY = 0;
if (useShadow) {
// shadow size (16px image: 1px left, 2px bottom)
shadowX = 1 * Math.round(1f / 16f * resizeToWidth);
shadowY = 2 * Math.round(1f / 16f * resizeToHeight);
resizeToWidth = resizeToWidth - shadowX;
resizeToHeight = resizeToHeight - shadowY;
}
if (resizeToWidth > 0) {
// your image width
transcoderHints.put(ImageTranscoder.KEY_WIDTH, (float) resizeToWidth);
}
if (resizeToHeight > 0) {
// your image height
transcoderHints.put(ImageTranscoder.KEY_HEIGHT, (float) resizeToHeight);
}
transcoderHints.put(ImageTranscoder.KEY_XML_PARSER_VALIDATING, Boolean.FALSE);
transcoderHints.put(ImageTranscoder.KEY_DOM_IMPLEMENTATION, SVGDOMImplementation.getDOMImplementation());
transcoderHints.put(ImageTranscoder.KEY_DOCUMENT_ELEMENT_NAMESPACE_URI, SVGConstants.SVG_NAMESPACE_URI);
transcoderHints.put(ImageTranscoder.KEY_DOCUMENT_ELEMENT, "svg");
transcoderHints.put(ImageTranscoder.KEY_USER_STYLESHEET_URI, cssFile.toURI().toString());
try {
TranscoderInput input = new TranscoderInput(svgFile);
ImageTranscoder t = new ImageTranscoder() {
@Override
public BufferedImage createImage(int w, int h) {
return new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
}
@Override
public void writeImage(BufferedImage image, TranscoderOutput out) {
imagePointer[0] = image;
}
};
t.setTranscodingHints(transcoderHints);
t.transcode(input, null);
} catch (Exception e) {
throw new IOException("Can't load svg file: " + svgInfo + " , reason: " + e.getMessage());
}
BufferedImage originImage = imagePointer[0];
if (useShadow && (originImage.getWidth() > 0)) {
// draw shadow
// origin image was reduces in sizes to fit shadow
// see https://stackoverflow.com/a/40833715/1276632
// a filter which converts all colors except 0 to black
ImageProducer prod = new FilteredImageSource(originImage.getSource(), new RGBImageFilter() {
@Override
public int filterRGB(int x, int y, int rgb) {
if (rgb == 0) {
return 0;
} else {
return 0xff000000;
}
}
});
// create whe black image
Image shadow = Toolkit.getDefaultToolkit().createImage(prod);
// result
BufferedImage result = new BufferedImage(originImage.getWidth() + shadowX, originImage.getHeight() + shadowY, originImage.getType());
Graphics2D g = (Graphics2D) result.getGraphics();
// draw shadow with offset (left bottom)
g.drawImage(shadow, -1 * shadowX, shadowY, null);
// draw original image
g.drawImage(originImage, 0, 0, null);
return result;
} else {
// return origin image without shadow
return originImage;
}
/*
BufferedImage base = GraphicsUtilities.createCompatibleTranslucentImage(w, h);
Graphics2D g2 = base.createGraphics();
g2.setColor(Color.WHITE);
g2.fillRoundRect(0, 0, image.getWidth(), image.getHeight(), 10, 10);
g2.dispose();
ShadowRenderer renderer = new ShadowRenderer(shadowSize, 0.5f,
Color.GRAY);
return renderer.createShadow(base);
*/
// imagePointer[0];
}
Aggregations