You are viewing a plain text version of this content. The canonical link for it is here.
Posted to batik-users@xmlgraphics.apache.org by Mark Riley <ma...@seriousintegrated.com> on 2013/08/29 00:20:12 UTC

Trying to transform SVG images. What is best method using Batik?

Sorry for all the mailing list questions. I'm quite new to SVG and Batik and feel a bit overwhelmed with all the pieces.

I'm trying to figure out the best way to transform SVG Images using the Batik Library. Our application would like to use SVG images and resize, scale, and rotate images. One current method I am trying is creating a new VG document and attaching the SVG I want to modify to it and then transforming the new SVG File. I'm not sure if this is the easiest or most correct way.

            DOMImplementation newSvgTest = SVGDOMImplementation.getDOMImplementation();
            String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
            Document newDoc = newSvgTest.createDocument(svgNS, "svg", null);

            Element root = newDoc.getDocumentElement();
            root.setAttributeNS(null, "viewBox", "0 0 100 100");

            Element svgTarget = newDoc.createElementNS(svgNS, "image");
            svgTarget.setAttributeNS(null, "x", "0");
            svgTarget.setAttributeNS(null, "y", "0");
            svgTarget.setAttributeNS(null, "width", width.toString());
            svgTarget.setAttributeNS(null, "height", height.toString());
            svgTarget.setAttributeNS(null, "transform", String.format("rotate(45, %f/2, %f/2)", width, height));
            svgTarget.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", this.getOwner().getSHIP().getImageResourceDir()+ File.separator + image.getFilename()); //SVG File

            root.appendChild(svgTarget);

But when I try to transcode this document all I get is the error:

         java.lang.IllegalStateException: Unknown protocol: c
                at org.apache.felix.framework.URLHandlersStreamHandlerProxy.toExternalForm(URLHandlersStreamHandlerProxy.java:481)
                at org.apache.felix.framework.URLHandlersStreamHandlerProxy.toExternalForm(URLHandlersStreamHandlerProxy.java:474)
                at java.net.URL.toExternalForm(URL.java:921)
                at java.net.URL.toString(URL.java:907)
                at org.apache.felix.framework.URLHandlersStreamHandlerProxy.openConnection(URLHandlersStreamHandlerProxy.java:267)
                at java.net.URL.openConnection(URL.java:971)
                at org.apache.batik.util.ParsedURLData.openStreamInternal(ParsedURLData.java:517)
                at org.apache.batik.util.ParsedURLData.openStream(ParsedURLData.java:471)
                at org.apache.batik.util.ParsedURL.openStream(ParsedURL.java:429)
                at org.apache.batik.bridge.SVGImageElementBridge.openStream(SVGImageElementBridge.java:377)
                at org.apache.batik.bridge.SVGImageElementBridge.createImageGraphicsNode(SVGImageElementBridge.java:242)
                at org.apache.batik.bridge.SVGImageElementBridge.buildImageGraphicsNode(SVGImageElementBridge.java:177)
                at org.apache.batik.bridge.SVGImageElementBridge.createGraphicsNode(SVGImageElementBridge.java:119)
                at org.apache.batik.bridge.GVTBuilder.buildGraphicsNode(GVTBuilder.java:213)
                at org.apache.batik.bridge.GVTBuilder.buildComposite(GVTBuilder.java:171)
                at org.apache.batik.bridge.GVTBuilder.build(GVTBuilder.java:82)
                at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:208)
                at org.apache.batik.transcoder.image.ImageTranscoder.transcode(ImageTranscoder.java:92)
                at org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(XMLAbstractTranscoder.java:142)
                at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:156)
                at com.seriousintegrated.ship.propertysets.ImagePropertySet.setScaledVectorImage(ImagePropertySet.java:233)
                at com.seriousintegrated.ship.propertysets.ImagePropertySet.mashImage(ImagePropertySet.java:153)
                at com.seriousintegrated.ship.propertysets.ImagePropertySet.mash(ImagePropertySet.java:401)
                at com.seriousintegrated.ship.objects.SHIPObject.mashProperties(SHIPObject.java:960)
                at com.seriousintegrated.ship.objects.SHIPObject.mash(SHIPObject.java:989)
                at com.seriousintegrated.ship.objects.SHIPObject.mash(SHIPObject.java:1005)
                at com.seriousintegrated.ship.objects.DryLandObject.mash(DryLandObject.java:101)
[catch] at com.seriousintegrated.ship.base.SHIP.mash(SHIP.java:414)
                at com.seriousintegrated.ship.tide.settings.project.MashWorker.doInBackground(MashWorker.java:46)
                at com.seriousintegrated.ship.tide.settings.project.MashWorker.doInBackground(MashWorker.java:25)
                at javax.swing.SwingWorker$1.call(SwingWorker.java:296)
                at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
                at java.util.concurrent.FutureTask.run(FutureTask.java:166)
                at javax.swing.SwingWorker.run(SwingWorker.java:335)
                at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
                at java.lang.Thread.run(Thread.java:724)

Thanks,
Mark

RE: Trying to transform SVG images. What is best method using Batik?

Posted by Mark Riley <ma...@seriousintegrated.com>.
That was definitely the issue, Thank you!

Im having some weird behavior from Batik on how it is generating images though.

            DOMImplementation newSvgTest = SVGDOMImplementation.getDOMImplementation();
            String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
            Document newDoc = newSvgTest.createDocument(svgNS, "svg", null);

            Element root = newDoc.getDocumentElement();
            root.setAttributeNS(null, "viewBox", String.format("0 0 %d %d", width, height));
            root.setAttributeNS(null, "preserveAspectRatio", "none");

            Element svgTarget = newDoc.createElementNS(svgNS, "image");
            svgTarget.setAttributeNS(null, "x", "0");
            svgTarget.setAttributeNS(null, "y", "0");
            svgTarget.setAttributeNS(null, "width", "100%");
            svgTarget.setAttributeNS(null, "height", "100%");
            svgTarget.setAttributeNS(null, "preserveAspectRatio", "none");
            File file = new File(this.getOwner().getSHIP().getImageResourceDir() + File.separator + image.getFilename());
            svgTarget.setAttributeNS("http://www.w3.org/1999/xlink", "href", Utilities.toURI(file).toString());

            root.appendChild(svgTarget);

I'm wrapping the image I want to transform and changing the viewBox in my application. I write the SVG out to file and I get the expected behavior when I view it in a web browser. When I generate a buffered image the image does not resize to the viewBox. The image stays the same size while the viewBox changes size

[cid:image001.png@01CEA55F.A89DC0B0].

This is the Code im using to generate the buffered image

            ShipTranscoder transcoder = new ShipTranscoder();
            TranscodingHints hints = new TranscodingHints();
            DOMImplementation impl = SVGDOMImplementation.getDOMImplementation();
            hints.put(ImageTranscoder.KEY_WIDTH, new Float(width));
            hints.put(ImageTranscoder.KEY_HEIGHT, new Float(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.setTranscodingHints(hints);
            transcoder.transcode(new TranscoderInput(newDoc), null);

            image.setImage(transcoder.getImage());

From: jonathan wood [mailto:jonathanshawwood@gmail.com]
Sent: Wednesday, August 28, 2013 5:26 PM
To: batik-users@xmlgraphics.apache.org
Subject: Re: Trying to transform SVG images. What is best method using Batik?

Hi Mark,

This line could be the problem.  Does the url perhaps begin with C: and maybe should be file: instead?


   svgTarget.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", this.getOwner().getSHIP().getImageResourceDir()+ File.separator + image.getFilename()); //SVG File

On Wed, Aug 28, 2013 at 6:20 PM, Mark Riley <ma...@seriousintegrated.com>> wrote:
Sorry for all the mailing list questions. I'm quite new to SVG and Batik and feel a bit overwhelmed with all the pieces.

I'm trying to figure out the best way to transform SVG Images using the Batik Library. Our application would like to use SVG images and resize, scale, and rotate images. One current method I am trying is creating a new VG document and attaching the SVG I want to modify to it and then transforming the new SVG File. I'm not sure if this is the easiest or most correct way.

            DOMImplementation newSvgTest = SVGDOMImplementation.getDOMImplementation();
            String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
            Document newDoc = newSvgTest.createDocument(svgNS, "svg", null);

            Element root = newDoc.getDocumentElement();
            root.setAttributeNS(null, "viewBox", "0 0 100 100");

            Element svgTarget = newDoc.createElementNS(svgNS, "image");
            svgTarget.setAttributeNS(null, "x", "0");
            svgTarget.setAttributeNS(null, "y", "0");
            svgTarget.setAttributeNS(null, "width", width.toString());
            svgTarget.setAttributeNS(null, "height", height.toString());
            svgTarget.setAttributeNS(null, "transform", String.format("rotate(45, %f/2, %f/2)", width, height));
            svgTarget.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", this.getOwner().getSHIP().getImageResourceDir()+ File.separator + image.getFilename()); //SVG File

            root.appendChild(svgTarget);

But when I try to transcode this document all I get is the error:

         java.lang.IllegalStateException: Unknown protocol: c
                at org.apache.felix.framework.URLHandlersStreamHandlerProxy.toExternalForm(URLHandlersStreamHandlerProxy.java:481)
                at org.apache.felix.framework.URLHandlersStreamHandlerProxy.toExternalForm(URLHandlersStreamHandlerProxy.java:474)
                at java.net.URL.toExternalForm(URL.java:921)
                at java.net.URL.toString(URL.java:907)
                at org.apache.felix.framework.URLHandlersStreamHandlerProxy.openConnection(URLHandlersStreamHandlerProxy.java:267)
                at java.net.URL.openConnection(URL.java:971)
                at org.apache.batik.util.ParsedURLData.openStreamInternal(ParsedURLData.java:517)
                at org.apache.batik.util.ParsedURLData.openStream(ParsedURLData.java:471)
                at org.apache.batik.util.ParsedURL.openStream(ParsedURL.java:429)
                at org.apache.batik.bridge.SVGImageElementBridge.openStream(SVGImageElementBridge.java:377)
                at org.apache.batik.bridge.SVGImageElementBridge.createImageGraphicsNode(SVGImageElementBridge.java:242)
                at org.apache.batik.bridge.SVGImageElementBridge.buildImageGraphicsNode(SVGImageElementBridge.java:177)
                at org.apache.batik.bridge.SVGImageElementBridge.createGraphicsNode(SVGImageElementBridge.java:119)
                at org.apache.batik.bridge.GVTBuilder.buildGraphicsNode(GVTBuilder.java:213)
                at org.apache.batik.bridge.GVTBuilder.buildComposite(GVTBuilder.java:171)
                at org.apache.batik.bridge.GVTBuilder.build(GVTBuilder.java:82)
                at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:208)
                at org.apache.batik.transcoder.image.ImageTranscoder.transcode(ImageTranscoder.java:92)
                at org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(XMLAbstractTranscoder.java:142)
                at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:156)
                at com.seriousintegrated.ship.propertysets.ImagePropertySet.setScaledVectorImage(ImagePropertySet.java:233)
                at com.seriousintegrated.ship.propertysets.ImagePropertySet.mashImage(ImagePropertySet.java:153)
                at com.seriousintegrated.ship.propertysets.ImagePropertySet.mash(ImagePropertySet.java:401)
                at com.seriousintegrated.ship.objects.SHIPObject.mashProperties(SHIPObject.java:960)
                at com.seriousintegrated.ship.objects.SHIPObject.mash(SHIPObject.java:989)
                at com.seriousintegrated.ship.objects.SHIPObject.mash(SHIPObject.java:1005)
                at com.seriousintegrated.ship.objects.DryLandObject.mash(DryLandObject.java:101)
[catch] at com.seriousintegrated.ship.base.SHIP.mash(SHIP.java:414)
                at com.seriousintegrated.ship.tide.settings.project.MashWorker.doInBackground(MashWorker.java:46)
                at com.seriousintegrated.ship.tide.settings.project.MashWorker.doInBackground(MashWorker.java:25)
                at javax.swing.SwingWorker$1.call(SwingWorker.java:296)
                at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
                at java.util.concurrent.FutureTask.run(FutureTask.java:166)
                at javax.swing.SwingWorker.run(SwingWorker.java:335)
                at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
                at java.lang.Thread.run(Thread.java:724)

Thanks,
Mark


Re: Trying to transform SVG images. What is best method using Batik?

Posted by jonathan wood <jo...@gmail.com>.
Hi Mark,

This line could be the problem.  Does the url perhaps begin with C: and
maybe should be file: instead?


   svgTarget.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href",
this.getOwner().getSHIP().getImageResourceDir()+ File.separator +
image.getFilename()); //SVG File


On Wed, Aug 28, 2013 at 6:20 PM, Mark Riley <
mark.riley@seriousintegrated.com> wrote:

> Sorry for all the mailing list questions. I’m quite new to SVG and Batik
> and feel a bit overwhelmed with all the pieces.****
>
> ** **
>
> I’m trying to figure out the best way to transform SVG Images using the
> Batik Library. Our application would like to use SVG images and resize,
> scale, and rotate images. One current method I am trying is creating a new
> VG document and attaching the SVG I want to modify to it and then
> transforming the new SVG File. I’m not sure if this is the easiest or most
> correct way.****
>
> ** **
>
>             DOMImplementation newSvgTest =
> SVGDOMImplementation.getDOMImplementation();****
>
>             String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;****
>
>             Document newDoc = newSvgTest.createDocument(svgNS, "svg",
> null);****
>
>             ****
>
>             Element root = newDoc.getDocumentElement();****
>
>             root.setAttributeNS(null, "viewBox", "0 0 100 100");****
>
>             ****
>
>             Element svgTarget = newDoc.createElementNS(svgNS, "image");***
> *
>
>             svgTarget.setAttributeNS(null, "x", "0");****
>
>             svgTarget.setAttributeNS(null, "y", "0");****
>
>             svgTarget.setAttributeNS(null, "width", width.toString());****
>
>             svgTarget.setAttributeNS(null, "height", height.toString());**
> **
>
>             svgTarget.setAttributeNS(null, "transform",
> String.format("rotate(45, %f/2, %f/2)", width, height));****
>
>             svgTarget.setAttributeNS("http://www.w3.org/1999/xlink",
> "xlink:href", this.getOwner().getSHIP().getImageResourceDir()+
> File.separator + image.getFilename()); //SVG File****
>
>             ****
>
>             root.appendChild(svgTarget);****
>
> ** **
>
> But when I try to transcode this document all I get is the error:****
>
> ** **
>
>          java.lang.IllegalStateException: Unknown protocol: c****
>
>                 at
> org.apache.felix.framework.URLHandlersStreamHandlerProxy.toExternalForm(URLHandlersStreamHandlerProxy.java:481)
> ****
>
>                 at
> org.apache.felix.framework.URLHandlersStreamHandlerProxy.toExternalForm(URLHandlersStreamHandlerProxy.java:474)
> ****
>
>                 at java.net.URL.toExternalForm(URL.java:921)****
>
>                 at java.net.URL.toString(URL.java:907)****
>
>                 at
> org.apache.felix.framework.URLHandlersStreamHandlerProxy.openConnection(URLHandlersStreamHandlerProxy.java:267)
> ****
>
>                 at java.net.URL.openConnection(URL.java:971)****
>
>                 at
> org.apache.batik.util.ParsedURLData.openStreamInternal(ParsedURLData.java:517)
> ****
>
>                 at
> org.apache.batik.util.ParsedURLData.openStream(ParsedURLData.java:471)****
>
>                 at
> org.apache.batik.util.ParsedURL.openStream(ParsedURL.java:429)****
>
>                 at
> org.apache.batik.bridge.SVGImageElementBridge.openStream(SVGImageElementBridge.java:377)
> ****
>
>                 at
> org.apache.batik.bridge.SVGImageElementBridge.createImageGraphicsNode(SVGImageElementBridge.java:242)
> ****
>
>                 at
> org.apache.batik.bridge.SVGImageElementBridge.buildImageGraphicsNode(SVGImageElementBridge.java:177)
> ****
>
>                 at
> org.apache.batik.bridge.SVGImageElementBridge.createGraphicsNode(SVGImageElementBridge.java:119)
> ****
>
>                 at
> org.apache.batik.bridge.GVTBuilder.buildGraphicsNode(GVTBuilder.java:213)*
> ***
>
>                 at
> org.apache.batik.bridge.GVTBuilder.buildComposite(GVTBuilder.java:171)****
>
>                 at
> org.apache.batik.bridge.GVTBuilder.build(GVTBuilder.java:82)****
>
>                 at
> org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:208)
> ****
>
>                 at
> org.apache.batik.transcoder.image.ImageTranscoder.transcode(ImageTranscoder.java:92)
> ****
>
>                 at
> org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(XMLAbstractTranscoder.java:142)
> ****
>
>                 at
> org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:156)
> ****
>
>                 at
> com.seriousintegrated.ship.propertysets.ImagePropertySet.setScaledVectorImage(ImagePropertySet.java:233)
> ****
>
>                 at
> com.seriousintegrated.ship.propertysets.ImagePropertySet.mashImage(ImagePropertySet.java:153)
> ****
>
>                 at
> com.seriousintegrated.ship.propertysets.ImagePropertySet.mash(ImagePropertySet.java:401)
> ****
>
>                 at
> com.seriousintegrated.ship.objects.SHIPObject.mashProperties(SHIPObject.java:960)
> ****
>
>                 at
> com.seriousintegrated.ship.objects.SHIPObject.mash(SHIPObject.java:989)***
> *
>
>                 at
> com.seriousintegrated.ship.objects.SHIPObject.mash(SHIPObject.java:1005)**
> **
>
>                 at
> com.seriousintegrated.ship.objects.DryLandObject.mash(DryLandObject.java:101)
> ****
>
> [catch] at com.seriousintegrated.ship.base.SHIP.mash(SHIP.java:414)****
>
>                 at
> com.seriousintegrated.ship.tide.settings.project.MashWorker.doInBackground(MashWorker.java:46)
> ****
>
>                 at
> com.seriousintegrated.ship.tide.settings.project.MashWorker.doInBackground(MashWorker.java:25)
> ****
>
>                 at javax.swing.SwingWorker$1.call(SwingWorker.java:296)***
> *
>
>                 at
> java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)****
>
>                 at java.util.concurrent.FutureTask.run(FutureTask.java:166)
> ****
>
>                 at javax.swing.SwingWorker.run(SwingWorker.java:335)****
>
>                 at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
> ****
>
>                 at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
> ****
>
>                 at java.lang.Thread.run(Thread.java:724)****
>
> ** **
>
> Thanks,****
>
> Mark****
>