2011-09-28 15 views
6

Uso anti aliasing para hacer que mis imágenes sean más fluidas. Al usar anti aliasing, se dibujará un borde oscuro alrededor de las imágenes. Esto sucede porque Android usa el color negro y lo mezcla con el amarillo de las imágenes. ¡Este es un problema de gernal! Cuando dibujo un rectángulo y establezco el valor alfa en 127, la imagen también se oscurece. En lugar de usar Android, el negro debe usar blanco para dibujar la transparencia.Error semi transparente de Android general

¿Hay alguna solución alternativa a cómo puedo manejar este problema?

Ejemplo de código fuente para dibujar un rectángulo semitransparente en un lienzo. El rectángulo también es oscuro, pero debe ser brillante.

Bitmap bmp = Bitmap.createBitmap(200, 200, Config.ARGB_8888); 
Canvas canvas = new Canvas(bmp); 
Paint rPaint = new Paint(); 
rPaint.setColor(Color.parseColor("#F7E836")); 
rPaint.setAlpha(127); 
rPaint.setStyle(Paint.Style.FILL); 
canvas.drawRect(0, 0, 100, 100, rPaint); 

Las imágenes son gráficos SVG, que se representan con la siguiente biblioteca: http://code.google.com/p/svg-android/

Creo que he encontrado el error. El problema es SurfaceView. Su fondo es negro. El mismo error semitransparente se produce cuando uso el código anterior y lo visualizo en un ImageView y el color de fondo del elemento de la interfaz de usuario detrás de ImageView es negro. El color de fondo de SurfaceView siempre es negro. Si cambio esto a blanco con setBackgroundColor, el SurfaceView se pone blanco, pero el fondo blanco se dibujará SOBRE TODAS mis otras imágenes dibujadas con OpenGL. Creo que estos deben ser cambiados. Primero se debe dibujar el color de fondo y las cosas de OpenGL.

Respuesta

2

Publique enlaces a las imágenes de origen originales y muestre cómo su suavizado (código).

Cuando una imagen es antialias, el algoritmo insertará colores entre los colores que componen los bordes. Entonces, con su imagen de estrella amarilla, si el fondo era blanco, intentará agregar píxeles alrededor del borde que estén entre el amarillo y el blanco (un tono más claro de amarillo). Esto es lo que 'suaviza' la imagen.

Pero, si la imagen tiene un espacio de color indexado, esos tonos más claros de amarillo probablemente no existan en la paleta de imágenes y, como resultado, puede obtener casi cualquier otro color en su lugar, sea cual sea el color en el índice aterriza en el valor del índice calculado.

La imagen de tu pregunta es un png indexado y, por lo tanto, tiene este problema.

Si este es el problema, entonces necesita convertir las imágenes de origen originales a un espacio de color no indexado, o alisarlas antes de indexar las imágenes que no funciona bien si las imágenes deben escalarse por su aplicación o si necesita anti-alias en contra de diferentes orígenes.

La otra cosa que podría estar sucediendo es que su antialiasing contra un fondo diferente de lo que cree que es, específicamente la estrella amarilla está antialias correctamente si el fondo era negro, publicar su código es la forma más fácil de resolver esto.

+0

Las imágenes son gráficos SVG que se representan utilizando la biblioteca vinculada anteriormente. El fondo nunca cambia. Se mantiene blanco. –

+0

Solo por razones de comprensión: el problema es que el SVG está dibujado con "bordes duros". Normalmente, el algoritmo encontrará un color entre el edgecolor y el color de fondo, pero en este ejemplo no hay un color de fondo, porque el svg se representa solo. Como resultado, se usará cualquier color. ¿Está bien? –

+0

¿Cómo está renderizando los SVG? ¿Estás rellenando ImageViews o tomándolos como una Imagen y dibujándolos en un Lienzo? – Mark

Cuestiones relacionadas