Como salvar um controle PictureBox como um arquivo jpeg após ter sido editado
-
21-08-2019 - |
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?
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 ??p>
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_ );