Pergunta

Eu tenho um bitmap de máscara (bmpmask) que estou desenhando para um bitmap de destino (bmpdest). Ambos os bitmaps têm canais alfa, mas já estão cheios de conteúdo opaco.

O que eu quero fazer é produzir áreas transparentes usando os métodos GDI+ 'Draw ...' no BMPMask para que o BMPDest apareça quando eu desenho o BMPMask sobre ele.

É claro gMask.DrawLine(Pens.Transparent, 0, y, wMax, y) Não causa alteração no BMPMask, porque o GDI+ funciona como projetado e não desenha nada quando transparente. Mesmo com cores semitransparentes, apenas os valores R, G, B dos pixels do BMPMASK são atualizados.

Mas o que eu quero fazer é emitir um método de desenho que alterará o canal alfa do BMPMask para que seja transparente quando desenhado no BMPDest. Sei que posso fazer isso com alternativas setpixel ou mais rápidas ou mais rápidas, mas isso causaria uma solução muito mais complicada. Obrigado.

Foi útil?

Solução

Encontrei 'a resposta' depois de 3 anos!

Eu nunca cheguei a experimentar a solução de Dan, então não quero tirar dela, mas isso faz exatamente o que eu quero:

    ' (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 É a chave! Finalmente, eu estava tentando corrigir essa falta novamente no meu programa, e uma pesquisa no Google apareceu este item que não tem nada a ver com o que eu procurei (ei, o Google pode ler sua mente).

Gráficos.Drawimage é muito lento para imagens maiores?

Maravilhoso! Agora, 10 Bucks diz, ninguém em todo o mundo jamais lê isso. 755

Outras dicas

Que eu saiba, a única maneira de alterar o canal alfa é, como você diz, usar o setpixel ou (é claro, muito melhor) ponteiros. Dependendo do que você está tentando fazer, você poderia Suba com o uso criativo de uma Colormatrix. Isso permitirá que você altere uma operação de drawimage de forma que você possa trocar o significado de R/G/B/A à medida que desenha. Tente isso para ter uma ideia:

        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 );
        }

Tente definir R/G/B para 1, respectivamente, e veja como isso muda quais cores são sólidas/transparentes. Mas, se você deseja alterar diretamente o canal alfa do bitmap, veja como fazê -lo: Imagens suaves em GDI+.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top