Discussion:
¿Como redimensionar (encoger) una imagen SVG en html?
(demasiado antiguo para responder)
MD
2006-10-03 01:50:11 UTC
Permalink
Buenas.

Ando con una duda que no resuelvo y eso que estado "googleando" bastante
en días pasados, la duda es: teniendo una imagen vectorial en SVG
estándar y probando múltiples etiquetas de html para mostrarla en la
pagina (<object> y <embed>), no encontrado manera humana de decirle un
simil en la etiqueta <img> a:

<img src="fichero.png" width="50%" height="50%" />

Hacer esto en plan:
<object type="image/svg+xml" data="fichero.svg" width="50%" height="50%" />

Lleva irremisiblemente a tener un bonito cuadro enmarcado en barras de
desplazamiento, pero nada de una imagen.svg encogida al 50%.

Y bueno también he recurrido a w3c española vía mail a ver si ellos ya
que son los del estandar SVG y HTML saben como hacerlo....pero el mail
salio hace varios dias y en un lenguaje correcto y cordial y todavía no
he recibido respuesta.

¿Alguien sabe como realizar esta tarea? Los motivos es para poner en mi
blog personal y cutrecillo ;) un par de imágenes en svg en el menú y tal.

Gracias y adiós.
ravenheart
2006-10-03 16:11:34 UTC
Permalink
No lo sé seguro, pero quizá con css???
MD
2006-10-04 01:55:29 UTC
Permalink
Post by ravenheart
No lo sé seguro, pero quizá con css???
Bueno no es mi fuerte los css, pero he andado probando y buscando por
internet a ver si era la solución, pero nada he conseguido los mismos
resultados que toqueteando los tags <object> o <embed> a mano, es decir
barras de desplazamiento pero el dicho fichero.svg no se ha encogido, ni
se ha agrandado.

No obstante gracias :) , por lo menos me diste otro camino que no se me
había ocurrido para atacar el problema.

Es curiosa la situación, porque un cacho flash si se redimensiona pero
el svg que debería ser también posible, no se consigue....pues como no
lo remedie los del W3C mal vamos xD.

Por cierto, ¿no creo que tenga nada que ver que el fichero de prueba es
un svg generado con inkscape (nada un cacho rectángulo y un par de
círculos), aunque guardado eso si como "svg plano" o estándar?


¿Existe alguna forma de dirigirse a la W3C para plantearle la duda? Es
por recurrir ya a las altas esferas, les he visto que tienen una lista
de correo para cada sección...no se supongo que debería probar por ahí.

Gracias y adíos.
ravenheart
2006-10-05 21:08:37 UTC
Permalink
Como te dice Oscar García por ahí abajo, los % se refieren al tamaño de
la página (o de la capa en la que estés). Has probado a poner el tamño
directamente en pixeles??
Post by MD
Bueno no es mi fuerte los css, pero he andado probando y buscando por
internet a ver si era la solución, pero nada he conseguido los mismos
resultados que toqueteando los tags <object> o <embed> a mano, es decir
barras de desplazamiento pero el dicho fichero.svg no se ha encogido, ni
se ha agrandado.
No obstante gracias :) , por lo menos me diste otro camino que no se me
había ocurrido para atacar el problema.
Es curiosa la situación, porque un cacho flash si se redimensiona pero
el svg que debería ser también posible, no se consigue....pues como no
lo remedie los del W3C mal vamos xD.
Por cierto, ¿no creo que tenga nada que ver que el fichero de prueba es
un svg generado con inkscape (nada un cacho rectángulo y un par de
círculos), aunque guardado eso si como "svg plano" o estándar?
¿Existe alguna forma de dirigirse a la W3C para plantearle la duda? Es
por recurrir ya a las altas esferas, les he visto que tienen una lista
de correo para cada sección...no se supongo que debería probar por ahí.
Gracias y adíos.
Oscar Garcia
2006-10-04 23:25:26 UTC
Permalink
Post by MD
Buenas.
<img src="fichero.png" width="50%" height="50%" />
Eso muestra una imagen que tenga el 50% del ancho de página (o espacio
libre contenedor) y el 50% de alto de página (o espacio libre
contenedor). Creo que si quieres que sea el 50% del tamaño original
vas por mal camino.
Post by MD
<object type="image/svg+xml" data="fichero.svg" width="50%" height="50%" />
Lleva irremisiblemente a tener un bonito cuadro enmarcado en barras de
desplazamiento, pero nada de una imagen.svg encogida al 50%.
¿Has mirado a ver si dicho objeto tiene propiedades que puedan ser
modificadas? Como los object que encapsulan objetos de Java.. Quizá
sería un buen comienzo.
Post by MD
¿Alguien sabe como realizar esta tarea? Los motivos es para poner en mi
blog personal y cutrecillo ;) un par de imágenes en svg en el menú y tal.
Entonces usa png :) no cuesta nada convertirlo con gimp o imagemagick
y también te guardará transparencias de 8 bits si no lo guardas como
imagen paletizada.
Post by MD
Gracias y adiós.
Hasta pronto y suerte.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/
MD
2006-10-05 21:45:08 UTC
Permalink
Bueno ya encontre algo ^_^.

Es un poco cochinete la solucion porque hay que tirar de javascript
desde html y en el fichero SVG hay que meterle un pequeño script. Osea
que no vale para cualquier fichero SVG encuentres por la red, porque
primero tienes que destriparlo para meterle el script.

No se si se podra encontrar un metodo generico que valga para cualquier
SVG sin destriparlo. Pero bueno este puede ser util para gente que tenga
acceso a los SVG para meterles mano.

Bueno aqui teneis la informacion:
http://digg.com/design/Scaling_SVG_Graphics


Pues eso un parche que funciona (en firefox he probado de momento). Y
aplicarlo (teniendo acceso al codigo fuente de los ficheros SVG...porque
sino estas vendido) es facil, se me ocurren miles de formas para
aplicarlo por ejemplo que la imagen ocupe toda la anchura del navegador
y cuando se redimensione se encoja (bueno mas o menos eso era mi
objetivo inicial :P y creo que lo cumple).

Y como nose si se pueden anexar ficheros en la lista, pego un pequeño
ejemplo de prueba:

------------------------HTML-----------------------------------------
<html>
<head><title>svg scaling with javascript</title>
<script type="text/javascript">
var W3CDOM = (document.createElement && document.getElementsByTagName);
window.onload = init;
function init(evt) {
SVGscale(0.5);
}
function SVGscale(scale) {
window.SVGsetDimension(500*scale,500*scale);
window.SVGsetScale(scale,scale);
if (!W3CDOM) return;
var box = document.getElementById('svgid');
box.width = 500*scale;
box.height = 500*scale;
}
</script>
</head>
<body bgcolor="#ffddff">
<object id="svgid" data="prueba.svg" type="image/svg+xml"
wmode="transparent" style="overflow: hidden;">
<param name="src" value="prueba.svg" wmode="transparent"
type="image/svg+xml">
</object>
Choose here:
<a href="#" onclick="SVGscale(0.1);">xsmall</a> or
<a href="#" onclick="SVGscale(0.25);">small</a> or
<a href="#" onclick="SVGscale(0.5);">medium</a> or
<a href="#" onclick="SVGscale(1);">1:1</a> or
<a href="#" onclick="SVGscale(1.5);">large</a> or ...
<h3>description</h3>
<a href="http://www.w3.org/TR/SVG/">here more about SVG</a>:
this doc was my only source for this demonstration. especially the part
about scripting is very interesting. this example shows how to rescale
a svg more or less dynamically. there are also methods for scaling
(rotation, transformation) svg dynamically and as an animation. this
doc does the following:
<ol>
<li>SVG doc is loaded embedded in the HTML, where an init function in
the SVG file's ECMA-script-part ...</li>
<li>...
registers functions in the top.* space. therefore, a script in this
HTML file can call those HTML2svg functions which execute something in
the SVG graphic. therefore you have to open the SVG file in a
texteditor</li>
<li>the init function of the HTML file resizes the svg to its initial
dimension</li>
</ol>

<h3>relevant code</h3>
<ul>
<li><h4>SVG, in and right after the header ...</h4></li>
<pre>onload="RunScript(evt)"
...
...
&lt;script type="text/ecmascript"&gt;
&lt;![CDATA[
var g_element;
var SVGDoc;
var SVGRoot;
function RunScript(LoadEvent) {
top.SVGsetDimension = setDimension;
top.SVGsetScale = setScale;
SVGDoc = LoadEvent.target.ownerDocument;
g_element = SVGDoc.getElementById("layer1");
}

function setDimension(w,h) {
SVGDoc.documentElement.setAttribute("width", w);
SVGDoc.documentElement.setAttribute("height", h);
}

function setScale(sw, sh) {
g_element.setAttribute("transform", "scale(" + sw + " " + sh +")");
}
]]&gt;
&lt;/script&gt; </pre> <li><h4>HTML</h4></li> <pre>&lt;script type="text/javascript"&gt;
var W3CDOM = (document.createElement &amp;&amp;
document.getElementsByTagName);
window.onload = init;
function init(evt) {
SVGscale(0.5);
}
function SVGscale(scale) {
window.SVGsetDimension(640*scale,480*scale);
window.SVGsetScale(scale,scale);
if (!W3CDOM) return;
var box = document.getElementById('svgid');
box.width = 640*scale;
box.height = 480*scale;
}
&lt;/script&gt;
</pre>
</ul>
</body>
---------------------------------------------------------------------


-------------------PRUEBA.SVG----------------------------------------
var SVGDoc;
var SVGRoot;
//var HTMLSVG;
function RunScript(LoadEvent) {
top.SVGsetDimension = setDimension;
top.SVGsetScale = setScale;
SVGDoc = LoadEvent.target.ownerDocument;
//HTMLSVG = top.document.getElementById("svgid");
g_element = SVGDoc.getElementById("layer1");
}

function setDimension(w,h) {
SVGDoc.documentElement.setAttribute("width", w);
SVGDoc.documentElement.setAttribute("height", h);
}

function setScale(sw, sh) {
g_element.setAttribute("transform", "scale(" + sw + " " + sh +")");
}
]]>
</script>
<defs
id="defs4" />
<g
id="layer1"
transform="translate(0,0)"><!--Importante el Inkscape tiene un bug
(uhmm hay que reportar) y mueve la capa aleatoriamente//-->
<rect
width="50"
height="500"
x="0"
y="0"

style="fill:blue;fill-rule:evenodd;stroke:black;stroke-width:0.65028489px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="rect1876" />
<rect
width="500"
height="50"
x="0"
y="450"

style="fill:blue;fill-rule:evenodd;stroke:black;stroke-width:0.65028489px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="rect1876" />
<rect
width="500"
height="50"
x="0"
y="0"

style="fill:red;fill-rule:evenodd;stroke:black;stroke-width:0.65028489px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="rect1876" />
<rect
width="50"
height="500"
x="450"
y="0"

style="fill:red;fill-rule:evenodd;stroke:black;stroke-width:0.65028489px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="rect1876" />
</g>
</svg>
---------------------------------------------------------------------

P.D. Ahora el chiste para mejorar el negocio seria encontrar uno
generico para no tener que toquetear un SVG y redimensionar cualquier
SVG que enlaces. Pero este es de momento es util, es sin duda.
ravenheart
2006-10-05 22:14:22 UTC
Permalink
Ultimamente está muy de moda esto del CSS y, si bien el HTML original
era una solemne guarrería por eso de mezclar los datos con los estilos,
cuando me he metido a hacer algo en CSS lo he encontrado absolutamente
anti-intuitivo; hay que dar mil vueltas para hacer cualquier tontería
simplísima - véase, para centrar una capa de menor anchura dentro de
otra, creo que el método estándar (al menos, según he visto, la única
manera de que funcione en todos los navegadores) es hacer algo como:
#capa_centrada
{
left = 50%;
left-margin = -mitad_del_tam_de_la_capa_en_pixeles;
}
que es una chapuza, entre otras cosas porque hay que conocer previamente
el tamaño (puede ser un problema si hay varias imagenes y quieres hacer
algo que funcione con todas), y, ¿que es eso de un margen negativo? ¿y
eso de que una capa, a base de margin, pueda dibujar mas allá de su
limite izquierdo/derecho?

En definitiva, que estoy harto de escuchar alabanzas y a mi me parece
una gran mierda.
¿Soy el único que piensa así?
Oscar Garcia
2006-10-05 23:02:22 UTC
Permalink
El Thu, 05 Oct 2006 23:14:22 +0100, ravenheart
Post by ravenheart
simplísima - véase, para centrar una capa de menor anchura dentro de
otra, creo que el método estándar (al menos, según he visto, la única
#capa_centrada
{
left = 50%;
left-margin = -mitad_del_tam_de_la_capa_en_pixeles;
}
que es una chapuza, entre otras cosas porque hay que conocer previamente
el tamaño (puede ser un problema si hay varias imagenes y quieres hacer
algo que funcione con todas), y, ¿que es eso de un margen negativo? ¿y
eso de que una capa, a base de margin, pueda dibujar mas allá de su
limite izquierdo/derecho?
Hombre, me parece una cochinada de CSS :)

<div id="Layer1"
style="background-color:red; position:absolute; left:154px; top:65px;
width:828px; height:472px; text-align: center;"><div id="Layer2"
style="background-color:blue; position:relative; width:262px;
height:189px; z-index:2"></div>

Como puedes ver, con un simple "text-align: center;" centrarás el
contenido de una capa, incluida otra capa que introduzcas en su
interior.
Post by ravenheart
En definitiva, que estoy harto de escuchar alabanzas y a mi me parece
una gran mierda.
¿Soy el único que piensa así?
Hombre, si lo usas para maquetar capas... yo no uso capas, evito
usarlas. Las uso para lo justo y necesario (menús, bocadillos y poco
más).

Yo uso la potencia de CSS para definir el formato del contenido del
documento y no su disposición.

Un saludo.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/
ravenheart
2006-10-06 23:48:51 UTC
Permalink
Post by Oscar Garcia
Hombre, me parece una cochinada de CSS :)
<div id="Layer1"
style="background-color:red; position:absolute; left:154px; top:65px;
width:828px; height:472px; text-align: center;"><div id="Layer2"
style="background-color:blue; position:relative; width:262px;
height:189px; z-index:2"></div>
Creo recordar que esto no funciona en explorer. Pero bueno, será cosa de
la implementación así que supongo que no cuenta. Probaré a ver.
Post by Oscar Garcia
P.D.: Este grupo se dedica a la programación (en concreto bajo linux).
Tu consulta es sobre diseño, así que el grupo que mejor se ajusta a
es.comp.infosistemas.www.paginas-web
Ya, si tampoco es que tenga demasiado interés, pero como ha salido el
tema del HTML/CSS he aprovechado, que hace tiempo que me ronda la mente
la cuestión "¿Es el CSS una mierda o soy yo que no me entra?"

En fin,

saludos.
Jellby
2006-10-07 08:53:52 UTC
Permalink
Post by ravenheart
Creo recordar que esto no funciona en explorer.
Pues culpa del Explorer, no del CSS (aunque dar posiciones absolutas en
píxeles no suele ser muy buena idea).
Post by ravenheart
[...] hace tiempo que me ronda la mente
la cuestión "¿Es el CSS una mierda o soy yo que no me entra?"
Lo normal es que sea una mierda el soporte CSS que tengan los navegadores,
no el CSS en sí. O sea, que si un código debería funcionar según la
especificación CSS y no lo hace, la culpa es del navegador, ¿no?
--
Ignacio __ Fernández Galván
/ /\
Linux user / / \ PGP Pub Key
#289967 / / /\ \ 0x01A95F99
/ / /\ \ \
http://djelibeibi.unex.es
/________\ \ \
jellby \___________\/ yahoo.com
ravenheart
2006-10-08 22:46:23 UTC
Permalink
Post by Jellby
Lo normal es que sea una mierda el soporte CSS que tengan los navegadores,
no el CSS en sí. O sea, que si un código debería funcionar según la
especificación CSS y no lo hace, la culpa es del navegador, ¿no?
Sí, desde luego. Quizá el problema esté en que no me he estudiado
bastante el estándar :-p

Oscar Garcia
2006-10-05 23:05:23 UTC
Permalink
El Thu, 05 Oct 2006 23:14:22 +0100, ravenheart
Post by ravenheart
#capa_centrada
{
left = 50%;
left-margin = -mitad_del_tam_de_la_capa_en_pixeles;
}
P.D.: Este grupo se dedica a la programación (en concreto bajo linux).
Tu consulta es sobre diseño, así que el grupo que mejor se ajusta a
tus necesidades, y donde te podrán discutir mejor sobre el tema será:
es.comp.infosistemas.www.paginas-web

Un saludo.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/
Loading...