2010-08-26 6 views
19

Según el original question, El resultado final es un rectificado png en un ImageView con una sombra natural.¿Cómo evitar que drawBitmap de Android solo dibuje imágenes en negro?

Tengo la sombra funcionando, pero cuando dibuja, hace que toda la imagen sea negra.

alt text

¿Cómo se puede evitar que la imagen original (definitivamente no negro) de ser negro cuando se añade a la sombra?

BlurMaskFilter blurFilter = new BlurMaskFilter(2, BlurMaskFilter.Blur.OUTER); 
    Paint shadowPaint = new Paint(); 
    shadowPaint.setMaskFilter(blurFilter); 

    int[] offsetXY = new int[2]; 
    Bitmap originalBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pier_t); 
    Bitmap shadowImage = originalBitmap.extractAlpha(shadowPaint, offsetXY); 

    Canvas c = new Canvas(shadowImage); 
    c.drawBitmap(originalBitmap, -offsetXY[0], -offsetXY[1], null); 

    imageView.setImageBitmap(shadowImage); 





ACTUALIZACIÓN:

implementé la sugerencia de Josh sobre la copia hacia el espacio de color correcto y ahora funciona muy bien! Para buscadores futuros, este código produce una sombra paralela en una vista de imagen. Puede jugar con la xey, así como la constante EXTERIOR para obtener el efecto deseado.

BlurMaskFilter blurFilter = new BlurMaskFilter(2, BlurMaskFilter.Blur.OUTER); 
Paint shadowPaint = new Paint(); 
shadowPaint.setMaskFilter(blurFilter); 

int[] offsetXY = new int[2]; 
Bitmap originalBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pier_t); 
Bitmap shadowImage = originalBitmap.extractAlpha(shadowPaint, offsetXY); 
Bitmap shadowImage32 = shadowImage.copy(Bitmap.Config.ARGB_8888, true); 

Canvas c = new Canvas(shadowImage32); 
c.drawBitmap(originalBitmap, -offsetXY[0], -offsetXY[1], null); 

imageView.setImageBitmap(shadowImage32); 

alt text

+0

¡Impresionante! Me alegro de que todo ese esfuerzo valga la pena. – Josh

+0

¿Qué debo hacer para cambiar el color de la sombra? – Frame91

Respuesta

12

He comentado en su última pregunta, pero aquí está de nuevo.

El problema podría ser que está dibujando una imagen de 32 bits (el original) en una imagen de 8 bits (la imagen de sombra extraída). Si ese es el caso, hacer algo como

Bitmap shadowImage32 = shadowImage.copy(ARGB_8888, true); 

después de la llamada extractAlpha, y dibujar sobre ese tipo en lugar de la ShadowImage de 8 bits.

3

tienes que dibujar tanto la imagen de la sombra y la imagen original. La imagen de la sombra solo contiene los valores alfa de la imagen original, no los píxeles de colores reales.

+0

¿No está sucediendo eso en la línea c.drawBitmap? Pensé que estaba dibujando el mapa de bits original en el lienzo con la imagen de sombra. ¿Puedes aclarar con el código? – coneybeare

+3

No, no puede. Está demasiado ocupado escribiendo respuestas de 1 línea y rompiendo Android para realmente preocuparse por lo que un desarrollador necesitaría. – StackOverflowed

Cuestiones relacionadas