xmlgraphics-batik-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Mark Riley <mark.ri...@seriousintegrated.com>
Subject RE: SVG BufferedImage Quality
Date Tue, 27 Aug 2013 22:27:34 GMT
I'm still struggling to figure out a way to improve the quality of my SVG images in Batik.

It seems this maybe an Antialiasing issue? I can't seem to find a transcoder hint that will
improve this.


From: Mark Riley [mailto:mark.riley@seriousintegrated.com]
Sent: Friday, August 23, 2013 2:41 PM
To: batik-users@xmlgraphics.apache.org
Subject: SVG BufferedImage Quality

I have a question about how to improve the quality of the images I'm generating for buffered


The left image is the image I generated with Batik while the right is the original. How do
I generate a Buffered Image of the same quality? My code currently looks like this:

Float width;
        Float height;

        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] buf = new byte[image.getStream().available()];
            int n = 0;
            while ((n = image.getStream().read(buf)) >= 0) {
                baos.write(buf, 0, n);
            byte[] content = baos.toByteArray();

            String parser = XMLResourceDescriptor.getXMLParserClassName();
            SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser);
            Document doc = f.createDocument(image.getFilename(), new ByteArrayInputStream(content));
            Element element = doc.getDocumentElement();
            if (element.hasAttributeNS(null, "viewBox")) {
                String[] parts = element.getAttribute("viewBox").split("\\ ");
                width = new Float(parts[2]);
                height = new Float(parts[3]);
            } else if (element.hasAttributeNS(null, "height") && element.hasAttributeNS(null,
"width")) {
                height = new Float(element.getAttributeNS(null, "height"));
                width = new Float(element.getAttributeNS(null, "width"));
            } else {
                width = new Float(100);
                height = new Float(100);

            ShipTranscoder transcoder = new ShipTranscoder();
            TranscodingHints hints = new TranscodingHints();
            DOMImplementation impl = SVGDOMImplementation.getDOMImplementation();
            hints.put(ImageTranscoder.KEY_WIDTH, width);
            hints.put(ImageTranscoder.KEY_HEIGHT, height);
            hints.put(ImageTranscoder.KEY_DOM_IMPLEMENTATION, impl);
            hints.put(ImageTranscoder.KEY_DOCUMENT_ELEMENT_NAMESPACE_URI, SVGConstants.SVG_NAMESPACE_URI);
            hints.put(ImageTranscoder.KEY_DOCUMENT_ELEMENT_NAMESPACE_URI, SVGConstants.SVG_NAMESPACE_URI);
            hints.put(ImageTranscoder.KEY_DOCUMENT_ELEMENT, SVGConstants.SVG_SVG_TAG);
            hints.put(ImageTranscoder.KEY_XML_PARSER_VALIDATING, false);
            transcoder.transcode(new TranscoderInput(new ByteArrayInputStream(content)), null);

        } catch (Throwable e) {
            String error = "Invalid input stream for SVG file type.";
            setError(SHIPPROPKEY.IMAGE_SOURCEFILE, error);
            LOGGER.log(Level.SEVERE, "        {0}\n", error);
            throw new MashException(getClass().getSimpleName()

class ShipTranscoder extends ImageTranscoder {

        private BufferedImage image = null;

        public BufferedImage createImage(int w, int h) {
            image = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
            return image;

        public void writeImage(BufferedImage img, TranscoderOutput out) {

        public BufferedImage getImage() {
            return image;


View raw message