2012-04-27 9 views
5

He buscado en Internet y no he encontrado nada, he buscado en otros ejemplos de KineticJS que utilizan un strokeWidth de 1 en sus rectángulos y todos parecen tener una línea semiopaca de 2 píxeles en lugar de una bonita línea negra opaca de 1px.KineticJS strokeEl ancho de 1 causa una línea borrosa y semiopaca en lugar de una línea nítida de 1 píxel

Ahora, supongo que como Google no tiene nada de lo que la solución es realmente simple o imposible, pero ... ¿sabes cómo puedo obtener un borde de un px usando KineticJS?

$(window).load(function(){ 
    var stage = new Kinetic.Stage({container: "kineticdiv", width: 700, height: 400}); 
    var layer = new Kinetic.Layer(); 

    var rect = new Kinetic.Rect({ 
     x: stage.attrs.width/2, y: stage.attrs.height/2, 
     width: 100, height: 100, 
     fill: "#eee", stroke: "black", strokeWidth: 1 
    }); 

    layer.add(rect); 
    stage.add(layer); 
}); 

Fig 1

Alguien tiene alguna idea?

+2

es posible que no esté alineando su trazado con píxeles. entonces la línea es la mitad en un pixel y la mitad en otro. intente agregar 0.5 a sus coords. –

+0

Lo que dijo @andrewcooke :) –

+0

Ah, sí, ahora lo recuerdo. Olvidé que esto sucede, recuerdo que sucedió hace uno o dos años cuando estaba jugando con XNA y tuve el mismo problema que con las fuentes borrosas. ¡Gracias chicos! –

Respuesta

9

Cuando dibuja una línea desde (x, y1) a (x, y2) (digamos, lo mismo vale para líneas horizontales) necesita preocuparse acerca de si x está "en el medio de un píxel". si la línea es "entre píxeles", será la mitad en uno y la mitad en otro. el resultado se verá borroso (básicamente es anti-aliasing).

los sistemas gráficos varían según si las coordenadas son para esquinas o centros, pero puede solucionar el problema experimentando un poco; solo necesita agregar un ancho de medio píxel a las coordenadas y vuelva a intentarlo.

en el caso de un lienzo html5 (0,0) es la esquina superior izquierda, por lo que si no tiene transformación supongo que el centro de píxeles superior izquierdo está en (0,5, 0,5).

+0

Sí, eso lo solucionó. ¡Siempre son los insectos más pequeños! Gracias –

2

Hay un enfoque genial para obtener exactamente lo que desea: agrupe dos formas similares. El que está en el nivel inferior es un píxel más grande que el de la parte superior. Llene la de abajo con el color que desea en su borde (en su caso: negro). funciona bien para mí y tiene la precisión y la calidad de CSS

+0

Actualmente no estoy trabajando en ese proyecto, sin embargo, su solución tiene mucho sentido. ¡Prestigio! –

+0

No he hecho esto con rectángulos, pero uso esto con texto. La capa superior de texto no tiene sombra ni trazo, pero pongo una capa duplicada de texto, con trazo y sombra, debajo de la capa superior. Mucho más legible, especialmente para texto pequeño. – DaveWalley

3

Otro enfoque: si usa números enteros como coordenadas y líneas de peso ortogonales de 1px, puede mover la etapa completa por [0.5, 0.5] y no tiene que agrega la mitad de un píxel a cada coordenada, puedes usar números enteros como coordenadas ya que toda tu etapa se moverá mitad de píxel a derecha y lo mismo a abajo.

+1

Buen punto en realidad. –

2

La manera más fácil de resolver esto con Kinetic es usar las propiedades de compensación. Así, en lugar de cambio de coordenadas individuales de lo que está dibujando, su línea entera/forma/grupo/capa/fase es compensado por tanto, en teoría conseguir el lugar que desee con el mínimo esfuerzo:

var rect = new Kinetic.Rect({ 
    x: stage.attrs.width/2, y: stage.attrs.height/2, 
    width: 100, height: 100, 
    fill: "#eee", stroke: "black", strokeWidth: 1, 
    offsetX: 0.5, 
    offsetY: 0.5 
}); 

o , para obtener un montón de cosas a la vez:

var layer = new Kinetic.Layer({ 
    offsetX: 0.5, 
    offsetY: 0.5 
}); 

Dicho esto, no todos los artículos se benefician de este truco. Algunos, de hecho, se vuelven más borrosos. Por lo tanto, asegúrese de aplicar el desplazamiento al nivel más atómico que evite contaminar formas que no se benefician de él.

Cuestiones relacionadas