Forçando uma caixa de imagem a manter sua imagem se a imagem foi desenhada usando o código em vb.net

StackOverflow https://stackoverflow.com/questions/1529211

  •  20-09-2019
  •  | 
  •  

Pergunta

Às vezes, minhas caixas de figuras estão longe de todos os desenhos quando terminam de criar a imagem ou, às vezes, no meio do caminho. Chamar gc.collect () antes do início do desenho, permite que ele desenhe mais antes de limpar, mas como posso impedir que ele seja limpo completamente?

Isso está em vb.net

Obrigado!

Foi útil?

Solução

Uma maneira fácil de persistir imagens desenhadas no .NET é fazer o desenho em um objeto de bitmap separado e, em seguida, definir a propriedade de imagem da PictureBox igual ao bitmap, assim:

Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
using (Graphics g = Graphics.FromImage(bmp))
{
    // draw whatever
}
pictureBox1.Image = bmp;

Desculpe, isso é C#, mas deve ilustrar o princípio OK.

Outra maneira de persistir imagens desenhadas é fazer o desenho no evento de pintura da PictureBox, mas isso significa que seu código de desenho será executado toda vez que o controle precisar para se repetir (o que ocorre sempre que outra forma é arrastada por cima dele etc.). O método acima (definindo a propriedade de imagem do controle) é mais simples de fazer.

Outras dicas

No caso acima, quando o objeto "bmp" ou "g" sai do escopo e o lixo coletado, a imagem da caixa de imagem muda. Eu acho que a imagem é sempre referência copiada. Eu tentei o BMP.Clone para copiar a imagem no PictureBox, mas ainda quando o BMP é coletado de lixo, a imagem do PictureBox desaparece. No meu caso, eu tenho várias imagens (determinadas em tempo de execução) a serem atribuídas a PictureBoxes criadas com tempo de execução.

Dim bm As New Bitmap("C:\picture.bmp")
Dim thumb As New Bitmap(42, 30)
Dim g As Graphics = Graphics.FromImage(thumb)

g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
g.DrawImage(bm, New Rectangle(0, 0, 42, 30), New Rectangle(0, 0, bm.Width, _bm.Height), GraphicsUnit.Pixel)
pbxHead.Image = thumb.Clone()

g.Dispose()
bm.Dispose()
thumb.Dispose()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top