Pregunta

Tengo un mapa de bits de máscara (bmpMask) que estoy dibujando en un mapa de bits de destino (bmpDest).Ambos mapas de bits tienen canales alfa pero ya están llenos de contenido opaco.

Lo que quiero hacer es producir áreas transparentes usando los métodos 'Dibujar...' de GDI+ en bmpMask para que bmpDest se muestre cuando dibujo bmpMask sobre él.

Por supuesto gMask.DrawLine(Pens.Transparent, 0, y, wMax, y) no provoca ningún cambio en bmpMask, porque GDI+ funciona según lo diseñado y no dibuja nada cuando es transparente.Incluso con colores semitransparentes, sólo se actualizan los valores r,g,b de los píxeles de bmpMask.

Pero lo que quiero hacer es emitir un método de dibujo que cambiará el canal alfa de bmpMask para que sea transparente cuando se dibuje en bmpDest.Sé que puedo hacer esto con SetPixel o alternativas más rápidas e inseguras o Marshall, pero eso causaría una solución mucho más complicada.Gracias.

¿Fue útil?

Solución

¡Encontré 'la' respuesta después de 3 años!

Nunca pude probar la solución de Dan, así que no quiero quitarle nada, pero esto hace exactamente lo que quiero:

    ' (setting composting mode is the key to getting the transparent
    ' line to actually result in setting the pixels to transparent-
    ' instead of just not drawing anything 'because it's transparent dummy' - 
    ' because it turns off the 'math' that is done to cause transparent
    ' image drawing to occur and just verbatim copies the bits).
    g1.CompositingMode = Drawing2D.CompositingMode.SourceCopy
    g1.DrawLine(Pens.Transparent, 0, y, wMax, y)
    g1.CompositingMode = Drawing2D.CompositingMode.SourceOver

CompostingMode ¡es la llave!Finalmente estaba intentando solucionar esta falta nuevamente en mi programa, y ​​una búsqueda en Google mostró este elemento que no tiene nada que ver con lo que buscaba (oye, Google puede leer tu mente).

¿Graphics.DrawImage es demasiado lento para imágenes más grandes?

¡Maravilloso!Ahora 10 dólares dicen que nadie en todo el mundo lee esto.755

Otros consejos

A mi entender, la única manera de alterar el canal alfa es, como usted dice, a utilizar (por supuesto, mucho mejor) o punteros SetPixel. Dependiendo de lo que estamos tratando de hacer a, que podría llegar a funcionar con el uso creativo de un ColorMatrix. Que le permitirá modificar una operación DrawImage de tal manera que se puede intercambiar el significado de R / G / B / A mientras la dibuja. Prueba esto para tener una idea:

        using ( var bmp = new Bitmap( 100, 100 ) )
        using ( var g = Graphics.FromImage( bmp ) )
        using ( var ia = new ImageAttributes() )
        {
            float R = 1;
            float G = 0;
            float B = 0;
            ia.SetColorMatrix( new ColorMatrix( new float[][] {
                new float[] {1, 0, 0, R, 0},
                new float[] {0, 1, 0, G, 0},
                new float[] {0, 0, 1, B, 0},
                new float[] {0, 0, 0, 0, 0},
                new float[] {0, 0, 0, 0, 1}} ) );
            g.Clear( Color.White );
            g.FillEllipse( Brushes.Blue, 10, 10, 30, 30 );
            g.FillEllipse( Brushes.Red, 60, 10, 30, 30 );
            g.FillEllipse( Brushes.Green, 10, 60, 30, 30 );
            g.FillEllipse( Brushes.Black, 60, 60, 30, 30 );
            e.Graphics.DrawImage(
                bmp,
                new Rectangle( 0, 0, 100, 100 ),
                0, 0, 100, 100,
                GraphicsUnit.Pixel,
                ia );
        }

Trate de establecer R / G / B a 1, respectivamente, y ver cómo lo que los cambios de colores que salen sólido / transparente. Sin embargo, si usted debe como para alterar el canal alfa del mapa de bits directamente, aquí está cómo hacerlo: bordes suaves imágenes en GDI +.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top