SALVAR IMAGEM EDITADA NO PICTUREBOX

ACCIOLLY 02/02/2015 00:34:48
#444196
Olá a todos os colegas do fórum.
estou enfrentando um problema persistente em um projeto. Criei um formulário de edição de imagens. Tudo está correndo bem, mas não consigo salvar a imagem editada. Se alguém já resolveu este problema no C# ou no VB será que poderia me dar uma força?
segue a codificação:

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
p1 = new Point(e.X, e.Y);
p2 = new Point(e.X, e.Y);
drawing = true;
}

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
drawing = false;

}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{

Graphics g = pictureBox1.CreateGraphics();

if (e.Button == MouseButtons.Left)
{
if (drawing)
{

if (controle == 1)
{
Point currentPoint = new Point(e.X, e.Y);
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
g.DrawLine(new Pen(cor, 5), p2, currentPoint);

}

}

}

}

private void btSalvar_Click(object sender, EventArgs e)
{

int contarquivos;


contarquivos = files + 1;
Image img = pictureBox.Image;


if (contarquivos < 10)
{
img.Save(@[Ô]C:\Imagem0[Ô] + contarq.ToString() +[Ô].jpg[Ô]);
}
else { img.Save(@[Ô]\C:\Imagem[Ô] + contarq.ToString() + [Ô].jpg[Ô]);
}


}

reparem que no ultimo evento eu copiei a imagem do picturebox pra variavel img, depois salvei ela em uma pasta. só que ela é salva sem as alterações.
desde já agradeço a colaboração...
TUNUSAT 02/02/2015 08:25:14
#444202
ACCIOLLY,

Talvez esteja faltando algum comando. Você não quer usar o [Ô]File Dialog[Ô]?

Exemplo:
https://social.msdn.microsoft.com/Forums/pt-BR/82ef91e9-1e2c-466d-a4c9-4971bf07d00d/como-salvar-imagem-da-picturebox?forum=vsvbasicpt
        Dim local As String
Dim img = New Bitmap(picImagem.Image)
Dim saveFileDialog1 As New SaveFileDialog()
saveFileDialog1.Filter = [Ô]JPeg Image|*.jpg|Bitmap Image|*.bmp|Gif Image|*.gif[Ô]
saveFileDialog1.Title = [Ô]Save an Image File[Ô]
saveFileDialog1.ShowDialog()
If saveFileDialog1.FileName <> [Ô][Ô] Then
local = saveFileDialog1.FileName
img.Save(local, System.Drawing.Imaging.ImageFormat.Jpeg)
End If


Ou assim:
path = [Ô]C:\imagem.jpg[Ô]
Dim img = New Bitmap(picImagem.Image)
img.Save(path,System.Drawing.Imaging.ImageFormat.Jpeg)


Veja também:

=============================================================
Dvida Para Salvar Imagem
http://www.postseek.com/meta/4ac98355c30c7be8fbf03c8fd774cddb
=============================================================
Salvar imagem do PictureBox no VB.NET
http://forum.imasters.com.br/topic/207464-salvar-imagem-do-picturebox-no-vbnet/
=============================================================
Salvar Imagem de uma PictureBox. -> C#
https://social.msdn.microsoft.com/Forums/vstudio/pt-BR/e2032755-5f7e-4865-824d-521088f9ffb4/salvar-imagem-de-uma-picturebox?forum=vscsharppt
=============================================================

[][ô]s,
Tunusat
ACCIOLLY 02/02/2015 09:56:12
#444213
já tentei de várias formas. por exemplo

Bitmap bmp = new Bitmap(PictureBox1.Image);
bmp.save(path,System.Drawing.Imaging.ImageFormat.Jpeg);

ou

Image img = PictureBox1.Image;
img.Save(path,System.Drawing.Imaging.ImageFormat.Jpeg);

A questão é que a imagem é salva, mas sem as alterações, pois eu desenho em cima delas.

TUNUSAT 02/02/2015 10:34:51
#444214
ACCIOLLY,

Já experimento salvar com outro nome?

[][ô]s,
Tunusat.
ACCIOLLY 02/02/2015 15:54:46
#444222
então...
elas estão sendo salvas com outro nome. o método do botão salvar chama outro método que verifica a quantidade de imagens dentro de uma pasta, logo depois ele nomeia o arquivo com [Ô]Imagem[Ô]+contarArquivos.ToString(). ou seja se na pasta já tem uma imagem01.jpg, a próxima é pra ser Imagem02.jpg
As vezes tenho a impressão de que o que é desenhado fica atrás da imagem quando salva. Mas é só impressão mesmo. rsrsrrs
TUNUSAT 02/02/2015 16:07:40
#444223
ACCIOLLY,

Pode ser que ficou em uma camada atrás quando salvou ... não se o objeto está trabalhando com [Ô]camadas de imagem[Ô].
Se for isto você precisa passar alguma coisa do tipo: [Ô]trazer para frente[Ô] (bring forward) na sua alteração antes de salvar

[][ô]s,
Tunusat.
OCELOT 03/02/2015 08:57:36
#444231
Resposta escolhida
O problema é que você não está pintando na imagem, e sim no controle, então quando tenta salvar a imagem ela nunca foi alterada.

Fora isso existe um outro problema muito grave no seu programa que é a criação de diversos objetos Graphics e objetos Pen sem nunca serem liberados pelo Dispose, isso pode causar grandes problemas para o programa se ele for usado por bastante tempo.

Segue um exemplo básico de como fazer isso, neste exemplo precisa ter uma imagem carregada no picture box antes de poder desenhar nele

        private bool drawing;
private Point ptInicial;

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
//marca o ponto inicial e que vai começar a desenhar
ptInicial = e.Location;
drawing = true;
}

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
//apenas marca que parou de desenhar
drawing = false;
}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
//primeiro de tudo verifica se está desenhando para não fazer algo desnecessário
if (drawing)
{
//cria um objeto Graphics a partir da Imagem do pictureBox em vez de criar a partir do controle
//o using garante que o objeto vai ser liberado depois de terminar de usar
using (var g = Graphics.FromImage(pictureBox1.Image))
{
g.SmoothingMode = SmoothingMode.AntiAlias;

//marca qual o ponto final da linha
var ptFinal = e.Location;

//cria o pen com o using para garantir que vai ser liberado depois de ser usado
using (var pen = new Pen(Color.Blue, 5))
{
g.DrawLine(pen, ptInicial, ptFinal);
}

//invalida o picture box, isso basicamente informa o Windows que o controle teve alguma modificação e precisa ser mostrada na tela
pictureBox1.Invalidate();
//passa o ponto final como novo ponto inicial para poder continuar desenhando de onde parou
ptInicial = ptFinal;
}
}
}

private void button1_Click(object sender, EventArgs e)
{
//aqui é só salvar a imagem normalmente
pictureBox1.Image.Save([Ô]c:\\users\\leandro\\desktop\    este paint.jpg[Ô], ImageFormat.Jpeg);
}


Uma coisa muito importante de se trabalhar com imagens no .Net é entender que ele usa o GDI+ para isso, e como tal usa recursos não gerenciado existe a necessidade se se chamar dispose em qualquer objeto que se cria que implemente IDisposable, ou como no caso do meu exemplo colocar tudo em [Ô]using[Ô]s para facilitar
Tópico encerrado , respostas não são mais permitidas