2010-02-12 22 views
11

Próbuję przeskalować obraz, zmodyfikować go, a następnie wyprowadzić do innego formatu obrazu. Do tej pory korzystałem z biblioteki apache batik. Dla prostej konwersji jest to łatwe. Aby przyciąć svg, jest to łatwe.Skalowanie SVG w Javie

Nie mogę jednak wymyślić sposobu skalowania do pełnego obrazu utworzonego przez svg. To znaczy, mogę określić obszar będący przedmiotem zainteresowania jako prostokąt ograniczający, a następnie skalować dzieła nad prostokącie ograniczającym, ale NIE wiem, jak skalować obraz svg.

To, co mam tak daleko:

... 
//set the output width and height 
transcoder.addTranscodingHint(PNGTranscoder.KEY_WIDTH, new Float(newSize.width)); 
transcoder.addTranscodingHint(PNGTranscoder.KEY_HEIGHT, new Float(newSize.height)); 

//set the aoi for scaling. Unsure what to do here. 
transcoder.addTranscodingHint(PNGTranscoder.KEY_AOI, new Rectangle(0, 0, 100, 100)); 
... 

Odpowiedz

7

Jeśli nie ustawić wskazówkę KEY_AOI transkodowania, wówczas atrybut viewBox="" na elemencie korzeń <svg> zostaną wykorzystane do określenia obszaru zainteresowania. Jeśli transkodowany dokument nie ma atrybutu viewBox="", użyte zostaną atrybuty width="" i height="", więc AOI będzie miało (0, 0, szerokość, wysokość).

A jeśli żadna z nich nie jest ustawiona i nie wiesz z góry, gdzie w układzie współrzędnych dokumentu znajdują się grafiki, możesz obliczyć ramkę ograniczającą głównego elementu <svg> i użyć jej jako AOI. Możesz to zrobić najpierw "booting the DOM" dla swojego dokumentu, a następnie wywołując getBBox() na elemencie dokumentu.

+0

Ponieważ będę miał do czynienia z różnymi obrazami SVG, prawdopodobnie będę musiał wykonać wszystkie 3 z nich. Dziękuję za szybką odpowiedź. Przyjmuję, gdy tylko będę mógł to przetestować. –

+0

@heycam, proszę, pomóżcie mi w tym pytaniu http://stackoverflow.com/questions/15286536/outofmemory-while-resizing-svg-file-using-apache-batik – Mihir