Pergunta

Eu tenho um PictureBox no meu aplicativo Windows Forms.

eu carregar uma imagem nele e eu tiver habilitado o evento Paint no meu código. Ele desenha um retângulo.

Como esta:

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    Graphics gr = e.Graphics;
    Pen p = new Pen(Color.Red);
    p.Width = 5.0f;
    gr.DrawRectangle(p, 1, 2, 30, 40);
}

E eu clique no botão "Salvar":

private void button2_Click(object sender, EventArgs e)
{
    pictureBox1.Image.Save(@"C:\Documents and Settings\tr1g3800\Desktop\WALKING\30P\100000test.jpg",ImageFormat.Jpeg);
}

Mas o arquivo salvo não contém o retângulo que eu desenhei.

Alguém tem alguma idéia?

Foi útil?

Solução

Você provavelmente não deve desenhar diretamente na PictureBox.

Você precisa usar um bitmap em seu lugar. Tente colocar o bitmap no PictureBox.Image e depois chamar Save ().

Verifique este para mais detalhes

Outras dicas

Thanks.Your resposta todos ajudaram. Isso funcionou

        private void button1_Click(object sender, EventArgs e)
    {
        pictureBox1.ImageLocation=@"C:\Documents and Settings\tr1g3800\Desktop\WALKING\30P\100000.jpg" ;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        pictureBox1.Image.Save(@"C:\Documents and Settings\tr1g3800\Desktop\WALKING\30P\100000test.jpg",ImageFormat.Jpeg);
    }

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {

    }

    private void button3_Click(object sender, EventArgs e)
    {
        Bitmap bmp = new Bitmap(pictureBox1.Image);
        Graphics gr = Graphics.FromImage(bmp);
        Pen p = new Pen(Color.Red);
        p.Width = 5.0f;
        gr.DrawRectangle(p, 1, 2, 30, 40);
        pictureBox1.Image = bmp;
    }

Aqui está a minha solução com suporte adicional para vários tipos de arquivos:

    public void ExportToBmp(string path)
    {
        using(var bitmap = new Bitmap(pictureBox.Width, pictureBox.Height))
        {
        pictureBox.DrawToBitmap(bitmap, pictureBox.ClientRectangle);
        ImageFormat imageFormat = null;

        var extension = Path.GetExtension(path);
        switch (extension)
        {
            case ".bmp":
                imageFormat = ImageFormat.Bmp;
                break;
            case ".png":
                imageFormat = ImageFormat.Png;
                break;
            case ".jpeg":
            case ".jpg":
                imageFormat = ImageFormat.Jpeg;
                break;
            case ".gif":
                imageFormat = ImageFormat.Gif;
                break;
            default:
                throw new NotSupportedException("File extension is not supported");
        }

        bitmap.Save(path, imageFormat);
        }
    }

Aqui está um pequeno exemplo que esclareceu algumas coisas para mim (eu estava lutando com isso um pouco demais).

PBox é um PictureBox em Formulário1, torná-lo pelo menos 50x50

appPath foi derivado de System.Reflection mas usar qualquer caminho que você gosta

Há dois botões, um para desenho, um para a poupança, os seus eventos de clique são no código abaixo.

Coisas que eu aprendi:

(1) "pBox.Image =" não fazer nada, mas inicializar a imagem PBox, ele não tem que ser um nome de arquivo como todos os exemplos que eu encontrei usado (teve problema ao salvar a esse mesmo arquivo porque ele foi share bloqueado ). Além disso, se o seu objetivo é ver as coisas em toda a superfície do controle, você provavelmente como definir o tamanho em tempo de inicialização para o tamanho que você precisa. Eu usei o tamanho do PBox neste exemplo, mas normalmente eu uso o tamanho bitmap (porque eu normalmente começam com um arquivo de imagem real).

(2) Eu sempre tive problemas, quer ver a minha chama aparecer no controle ou ver minhas alterações salvas no arquivo de saída (ou ambos). Em minhas tentativas anteriores eu iria duplicar o atrai tanto no controle e no bitmap. Claro que isso não é necessário, mas o bitmap editado não precisa ser recarregado na control.image ... e que era a peça do quebra-cabeça que estava faltando.

(A) Criar um bitmap do control.image e desenhar no bitmap

(B) Coloque o bitmap para o control.Image (assim você pode ver as mudanças causadas pelo empate)

(C) Salvar o control.Image

(2-opção) Você tem um bitmap global (ou passado) (provavelmente a partir de um arquivo real)

(A) Desenhe no bitmap

(B) Coloque o bitmap para o control.Image (assim você pode ver as mudanças)

(C) salvar o bitmap

    public Form1()
    {
        InitializeComponent();
        pBox.Image = new Bitmap(pBox.Width, pBox.Height);  
    }

    private void DrawStuff1_Click(object sender, EventArgs e)
    {
        Bitmap bmp = new Bitmap(pBox.Image);  
        Graphics g = Graphics.FromImage(bmp);

        g.FillRectangle(Brushes.Red, 5, 5, 25, 25); //hard-coded size to reduce clutter

        pBox.Image = bmp;  //this makes your changes visible
    }

    private void Save_Click(object sender, EventArgs e)
    {
        pBox.Image.Save(appPath + "SavedImage.bmp");
    }

Você precisa pintar a imagem de imagem, não para o controle de gráficos em evento Paint.

EDIT:

using( Graphics g = Graphics.FromImage( pictureBox1.Image ) ) {
    // there you will be do, what you do in Paint event
}

// ... somewhere else ...
pictureBox1.Save( _required_parameters_ );
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top