Pergunta

Primeiro de tudo, não se trata de tornar o controle da caixa de imagem transparente. É sobre transparência de bitmap na "tela" totalmente opaca.

A caixa de imagem sempre terá o tamanho de 300*300 com fundo branco. Nenhuma transparência é necessária para o controle.

O que eu preciso é a maneira de desenhar o retângulo transparente (ou qualquer outra coisa) na caixa de imagem, para que qualquer coisa que já estivesse lá será vista "através do retângulo.

Diga que tenho um código seguinte

Bitmap bmp = new Bitmap(300, 300);
Graphics g = Graphics.FromImage(bmp);
g.FillRectangle(new SolidBrush(Color.White), 0, 0, 300, 300);
g.FillRectangle(new SolidBrush(Color.Red), 100, 100, 100, 100);
pictureBox.Image = bmp;

Isso desenhará um retângulo vermelho no meio da tela branca. Agora, preciso de outra "camada" (transparente) na figura que contém outro retângulo, mas que é transparente.

eu posso tentar

Brush brush = new SolidBrush(Color.FromArgb(128, 0, 80, 0));
g.FillRectangle(brush, 50, 50, 200, 200);

Como estou usando uma cor especificando seu alfa = 128, o retângulo resultante deve ser transparente para que o primeiro retângulo vermelho deve ser visto através deste outro verde.

No entanto, isso não acontece corretamente. Eu posso ver o retângulo vermelho atrás do novo verde, mas a parte do retângulo verde que não se sobrepõe ao vermelho permanecerá completamente opaco. No entanto, se eu definir o valor alfa da cor como um valor extremamente pequeno (digamos 1-5), todo o retângulo ficará transparente. Isso não é normal na minha opinião - que 5/255 é apenas metade transparente e que 128/255 não é transparente ... e se houve uma corda desenhada anteriormente com G.DrawString (), a corda é exibida atrás o retângulo verde ou não é, dependendo do nível de transparência. Por exemplo, se o alfa for maior que igual (em torno) 40, a corda não será visível e, se for menor que 40, será exibido, mais visível para valores alfa menores, até alfa = 0.

Como esse pincel é aplicado (quando criado a partir da cor argb)? Estou esquecendo de algo? Para mim, parece que a configuração de um pincel transparente torna o plano de fundo "mais visível" em vez de definir o objeto "menos visível".

Obrigado por quaisquer respostas com sugestões.

EDITAR Parece que eu tinha um bug desagradável na lógica do aplicativo, então a rotina de desenho aconteceu em um loop; portanto, quando acumulei um certo número de retângulos transparentes, eles se tornaram cada vez mais espessos.

O código, quando retirado do loop, funciona corretamente.

Foi mal.

Foi útil?

Solução

TEXTO ALT http://lh4.ggpht.com/_1tpop7dzy1e/s02ivaoggti/aaaaaaaac6s/zqvzq5gdwsu/s800/capture4.png

é feito por este código:

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        Bitmap bmp = new Bitmap(300, 300);
        Graphics g = Graphics.FromImage(bmp);
        g.FillRectangle(new SolidBrush(Color.White), 0, 0, 300, 300);
        g.FillEllipse(new SolidBrush(Color.Blue), 25, 25, 100, 200);
        g.FillRectangle(new SolidBrush(Color.Red), 100, 100, 300, 100);
        g.DrawString("this is a STRING", SystemFonts.DefaultFont, 
            Brushes.Black, new Point(150, 150));
        pictureBox1.Image = bmp;

        Brush brush = new SolidBrush(Color.FromArgb(40, 0, 80, 0));
        g.DrawRectangle(Pens.Black, 50, 50, 200, 200);
        g.FillRectangle(brush, 50, 50, 200, 200);
    }

A parte verde não é opaca como você pode ver ... a corda é perfeitamente visível.

Para mim, parece que a configuração de um pincel transparente torna o plano de fundo "mais visível" em vez de definir o objeto "menos visível".

Antecedentes "mais visíveis" e objeto "menos visível" são a mesma coisa ...

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