none
Alteração do tamanho de imagens. RRS feed

  • Pergunta

  • Boa tarde amigos.

    Através de um código criado por um companheiro aqui do fórum desenvolvi uma aplicação para redimensionar imagens de acordo com a necessidade do meu cliente.

    Mas para mim poder recadastrar uma imagem nova eu preciso apagar a imagem anterior, o problema é que enquanto a aplicação está rodando eu não consigo apagar a anterior para cadastrar a nova, preciso fechar e abrir o programa. O erro que exibe é: The process cannot access the file c:\Imagens\foto01.jpg because it is being used by another process.

    Alguém pode me dar uma idéia de como proceder para apagar a foto do sistema para conseguir cadastrar outra???

    O código para alteração do tamanho da imagem é esse:

    public static void ajustaTamanhoImagem(String origem, String Destino, String nome)
            {
                int Largura = 640;
                int Altura = 480;
                int vLargura, vAltura;
                string vExtensao;
                Image vImagemOriginal = null;
                Image vImagemFinal = null;
    
                try
                {
                    vImagemOriginal = Image.FromFile(origem);
                    //vImagemOriginal = Image.FromStream(ImagemOriginal.InputStream);
    
                    //Calculo para manter imagem em proporção sem perca de qualidade
                    if ((vImagemOriginal.Width / Largura) > (vImagemOriginal.Height / Altura))
                    {
                        vLargura = Largura;
                        vAltura = (int)(vImagemOriginal.Height * ((float)Largura / (float)vImagemOriginal.Width));
    
                        if (vAltura > Altura)
                        {
                            vLargura = vLargura * (Largura / Altura);
                            vAltura = Altura;
                        }
                    }
                    else
                    {
                        vAltura = Altura;
    
                        vLargura = (int)(vImagemOriginal.Width * ((float)Altura / (float)vImagemOriginal.Height));
    
                        if (vLargura > Largura)
                        {
                            vAltura = vAltura * (Largura / vLargura);
                            vLargura = Largura;
                        }
                    }
    
                    //Objeto vImagemFinal recebe vImagemOriginal
                    vImagemFinal = new Bitmap(vImagemOriginal);
    
                    //Redimensiona o tamanho da imagem
                    vImagemFinal = vImagemFinal.GetThumbnailImage(vLargura, vAltura, null, System.IntPtr.Zero);
    
                    try
                    {
                        vExtensao = ".jpg";
    
                        //Salvando Imagem Redimensionada
                        vImagemFinal.Save(String.Format("{0}{1}{2}", Destino, nome, vExtensao));//, ImageFormat.Jpeg);
                    }
                    catch (Exception Exc)
                    {
                        MessageBox.Show("Erro ao ajustar a imagem.\n" + Exc.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                catch (Exception Exc)
                {
                    MessageBox.Show("Erro ao ajustar a imagem..\n" + Exc.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
    

    e o código que chama a alteração da imagem é esse:

    case "foto01":
                        //Apaga a foto01
                        if (System.IO.File.Exists(@"c:\\Imagens\\foto01.jpg"))
                        {
                            try
                            {
                                enderecoImagem01 = "";
                                enderecoImagem01 = null;
                                MS01 = null;
                                file01 = null;
                                tamanho01 = 0;
                                pictureBox1.Image = null;
    
                                System.IO.File.Delete(@"c:\\Imagens\\foto01.jpg");
                            }
                            catch (Exception Exc)
                            {
                                MessageBox.Show("Erro ao limpar os arquivos da Foto01\n" + Exc.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            }
                        }
    
                        openFileDialog1.InitialDirectory = @"C:\";
                        openFileDialog1.Filter = "(Jpeg Files) *.jpg | *.jpg";
                        openFileDialog1.Title = "Selecione a foto JPG para adicionar";
                        openFileDialog1.ShowDialog();
                        enderecoImagem01 = openFileDialog1.FileName;
                        ajustaTamanhoImagem(enderecoImagem01, "C:\\Imagens\\", "foto01");
    
                        try
                        {
                            MS01 = new System.IO.MemoryStream();
                            pictureBox1.Image = Image.FromFile("c:\\Imagens\\foto01.jpg");
                            pictureBox1.Image.Save(MS01, System.Drawing.Imaging.ImageFormat.Jpeg);
                            tamanho01 = int.Parse(MS01.Length.ToString());
                            file01 = new byte[MS01.Length];
                            file01 = MS01.ToArray();
                            foto01.BackColor = Color.Red;
                        }
                        catch
                        { }
                        break;
    


    quarta-feira, 1 de fevereiro de 2012 15:09

Respostas

  • voce não deve ta dando "Dispose" nos objetos utilizados na criação da imagem. Logo, quando tenta excluir o arquivo o sistema diz que o arquivo está sendo usado por outro processo. Dessa forma, você não conseguirá excluir o arquivo nem indo diretamente no diretório e excluindo manualmente, pois dará o mesmo erro. Quando você trabalha com arquivos ou memória há sempre necessidade de se "encerrar" o objeto depois de seu uso, pois se não o fizer pode ocorrer esses problemas de acesso ao arquivo ou acarretar overflow de memória no servidor. Para encerrar o objeto, faça "meuobjeto.Dispose();". No seu caso, verifique quais objetos utilizados tem essa propriedade, se tiverem indica que vc deve encerra-lo depois de seu uso.  Um exemplo é o objeto do tipo MemoryStream que você está utilizando, sempre feche-o com o "meuobjeto.Dispose()" depois da utilização.

    Antes de refazer os testes, reinicialize o asp.net, va no diretorio do arquivo apague todos e comece a testar e verificar se o arquivo continuará pendurado na aplicação.

    Espero ter ajudado. Abraço!

    • Marcado como Resposta Rabinson quinta-feira, 2 de fevereiro de 2012 16:04
    quinta-feira, 2 de fevereiro de 2012 14:44

Todas as Respostas

  • Boa tarde,

    Acredito que você poderia fazer a operação de apagar a imagem em uma outra página. Se estiver OK você volta retorna sucesso e volta para a página anterior

    quarta-feira, 1 de fevereiro de 2012 19:21
  • Na verdade é um programa e o meu cliente quer que no mesmo programa ele possa cadastrar quantas fotos forem necessárias.

    A primeira execução vai de boa, mas a seguinte não roda pq o programa não consegue apagar a imagem anterior que está no disco pra renderizar a nova.

    quarta-feira, 1 de fevereiro de 2012 19:38
  • voce não deve ta dando "Dispose" nos objetos utilizados na criação da imagem. Logo, quando tenta excluir o arquivo o sistema diz que o arquivo está sendo usado por outro processo. Dessa forma, você não conseguirá excluir o arquivo nem indo diretamente no diretório e excluindo manualmente, pois dará o mesmo erro. Quando você trabalha com arquivos ou memória há sempre necessidade de se "encerrar" o objeto depois de seu uso, pois se não o fizer pode ocorrer esses problemas de acesso ao arquivo ou acarretar overflow de memória no servidor. Para encerrar o objeto, faça "meuobjeto.Dispose();". No seu caso, verifique quais objetos utilizados tem essa propriedade, se tiverem indica que vc deve encerra-lo depois de seu uso.  Um exemplo é o objeto do tipo MemoryStream que você está utilizando, sempre feche-o com o "meuobjeto.Dispose()" depois da utilização.

    Antes de refazer os testes, reinicialize o asp.net, va no diretorio do arquivo apague todos e comece a testar e verificar se o arquivo continuará pendurado na aplicação.

    Espero ter ajudado. Abraço!

    • Marcado como Resposta Rabinson quinta-feira, 2 de fevereiro de 2012 16:04
    quinta-feira, 2 de fevereiro de 2012 14:44
  • Marcos, era exatamente isso. Eu não dava dispose no picturebox.image, apenas setava como null (não sabia que tinha diferenças).

    Mas enfim, o problema foi resolvido e estou colocando abaixo a minha solução:

                       //Apaga a foto01
                        if (System.IO.File.Exists(@"c:\\Imagens\\foto01.jpg"))
                        {
                            try
                            {
                                if (pictureBox1.Image != null)
                                    pictureBox1.Image.Dispose();
                                System.IO.File.Delete(@"c:\\Imagens\\foto01.jpg");
                            }
                            catch (Exception Exc)
                            {
                                MessageBox.Show("Erro ao limpar os arquivos da Foto01\n" + Exc.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            }
                        }
    
                        openFileDialog1.InitialDirectory = @"C:\";
                        openFileDialog1.Filter = "(Jpeg Files) *.jpg | *.jpg";
                        openFileDialog1.Title = "Selecione a foto JPG para adicionar";
                        openFileDialog1.ShowDialog();
                        enderecoImagem01 = openFileDialog1.FileName;
                        ajustaTamanhoImagem(enderecoImagem01, "C:\\Imagens\\", "foto01");
    
                        try
                        {
                            MS01 = new System.IO.MemoryStream();
                            pictureBox1.Image = Image.FromFile("c:\\Imagens\\foto01.jpg");
                            pictureBox1.Image.Save(MS01, System.Drawing.Imaging.ImageFormat.Jpeg);
                            tamanho01 = int.Parse(MS01.Length.ToString());
                            file01 = new byte[MS01.Length];
                            file01 = MS01.ToArray();
                            foto01.BackColor = Color.Red;
                            atualizarFoto01 = 1;
                        }
                        catch
                        { }
    

    quinta-feira, 2 de fevereiro de 2012 16:03