Batik und elementare Transformationen

antimon

Mitglied
Hallo zusammen,

eigentlich hört sich das Toolkit Batik von Apache ( http://xmlgraphics.apache.org/batik/ ) recht interessant an - aber irgendwie finde ich keine gescheite Dokumentation dazu oder stelle mich zu dämlich an...

Eigentlich möchte ich "nur" kleine SVG-Icons laden und diese dann skalieren oder drehen - nur wie mache ich das am sinnvollsten? Eigentlich dachte ich mir, ich lade die Datei, skaliere und drehe sie nach Bedarf und zeige sie an - das heisst also die Datei selbst wird nicht verändert, nur die Anzeige.

Oder ist das der falsche Weg und ich müsste die Datei selbst bearbeiten? Evtl. sogar direkt den XML-Code anpassen anstatt irgendeine Methode "rotate(...)" oder so ähnlich aufzurufen?

Ziel ist es, Grafiken wie in einem Programm a la CorelDraw verschieben (das geht schon, aber da verschieb ich ja nur die Komponente, auf die ich zeichne), drehen und skalieren zu können...
 
Hallo,

SVG Grafiken kann man ganz einfach mit dem JSVGCanvas anzeigen lassen.
Um die in SVG modellierte Grafik zu manipulieren (Rotieren, Sklarieren, etc) kannst du
das SVG-XML beim Laden manipulieren bzw. das SVG DOM nachträglich abändern.
Eine andere Möglichkeit ist es eine AffineTransform auf die Grafik anzuwenden.

Wenn du im Speicher on the Fly icons erzeugen / Transformieren wilslt, kannst du dir das Transcoder API mal anschauen:
http://xmlgraphics.apache.org/batik/using/transcoder.html#createImage

Java:
/**
 * 
 */
package de.tutorials;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.geom.AffineTransform;

import javax.swing.JFrame;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import org.apache.batik.swing.JSVGCanvas;

/**
 * @author Tom
 * 
 */
public class BatikSVGExample extends JFrame {

	public BatikSVGExample() {
		super("BatikSVGExample");
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		final JSVGCanvas svgCanvas = new JSVGCanvas();
		svgCanvas.setPreferredSize(new Dimension(640, 480));
		svgCanvas.setEnableZoomInteractor(true);
		add(svgCanvas, BorderLayout.CENTER);

		final JSlider slider = new JSlider(0, 100);
		add(slider, BorderLayout.SOUTH);
		slider.addChangeListener(new ChangeListener() {
			@Override
			public void stateChanged(ChangeEvent e) {
				//if (!slider.getValueIsAdjusting()) {
					svgCanvas.setRenderingTransform(AffineTransform
							.getScaleInstance(slider.getValue() / 100.0, slider
									.getValue() / 100.0));
				//}
			}
		});
		pack();

		svgCanvas
				.loadSVGDocument("file:///D:/stuff/batik/1.7/batik-1.7/samples/gradients.svg");

	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new BatikSVGExample().setVisible(true);
	}

}

Gruß Tom
 
Hmm dass man die AffineTransform auch auf das SVG-Canvas anwenden kann wusste ich nicht - das ist genau das was ich suche... du bist genial Tom.

Manchmal frage ich mich ob es was gibt, was du nicht weisst (zumindest auf Java bezogen) ;)

Ich hab die (meiner Meinung nach schlechte) Batik-Doku ewig lang durchsucht, aber nichts gefunden...


Dann hätte ich gleich noch eine Frage: (Wie) kann ich bestimmte Bereiche einer Grafik finden und einfärben?

Ich habe folgende Aufgabe: Ich habe ein Symbol, das eine gefüllte Fläche hat, die je nach Zustand einer Variable die Farbe ändern soll. Sowas könnte eine Boolean-Variable sein, wobei false rot dargestellt und true grün angezeigt werden soll.

Kann ich die Grafik nach einer bestimmten ID durchsuchen, das Objekt mit dieser ID laden und dessen Farbe ändern? Oder kann ich irgendwie mit Stylesheets arbeiten und je nach Status ein anderes CSS für die Grafik laden? Dass das prinzipiell geht, weiss ich - nur wie ich das in Java mit Batik realisieren kann, ist mir leider schleierhaft. Batik kann zwar sehr viel, aber aus der Doku bin ich noch nicht wirklich schlau geworden...
 

Neue Beiträge

Zurück