Upload e redimensionamento

24/08/2009

Olá,


estou trabalhando com um projeto asp.net , parecido com um e-commerce,

nele preciso acrescentar uma página de pesquisa  para trazer os dados  e deopis desta página acrescentar outra de detalhes,


na gridview gostaria de ter uma imagem menor que a original.


ou seja


coo faço para que quando realizar o Upload ele acrescentar outro imagem redimensionada, mas que esta  tenha  a altura e largura compativel com o tamanho do campo da gridview.


???


espero ter sido claro...


Fico no aguardo
Fernando Reis

Fernando Reis

Curtidas 0

Respostas

Luiz Maia

Luiz Maia

24/08/2009

Ola Fernando,   Para isto é preciso a geração de um "Thumb". Segue exemplo:   public byte[] GerarThumbsDaImagem(System.Drawing.Image fullImage)
        {
            Size novoTamanhoImagem = new Size(320 , 240);

            MemoryStream memoryStream = new MemoryStream();

            System.Drawing.Image thumbsImage = new Bitmap(novoTamanhoImagem.Width, novoTamanhoImagem.Height, fullImage.PixelFormat);
            Graphics grfx = Graphics.FromImage(thumbsImage);

            grfx.CompositingQuality = CompositingQuality.HighSpeed;
            grfx.SmoothingMode = SmoothingMode.HighSpeed;
            grfx.InterpolationMode = InterpolationMode.HighQualityBicubic;

            grfx.DrawImage(fullImage, -1, -1, novoTamanhoImagem.Width + 1, novoTamanhoImagem.Height + 1);
            grfx.Save();

            //System.Drawing.Image thumbsImage = fullImage.GetThumbnailImage(novoTamanhoImagem.Width, novoTamanhoImagem.Height, null, IntPtr.Zero);
            thumbsImage.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg);

            grfx.Dispose();

            thumbsImage.Dispose();
            thumbsImage = null;

            byte[] byteData = new byte[memoryStream.Length];
            memoryStream.Seek(0, SeekOrigin.Begin);
            memoryStream.Read(byteData, 0, byteData.Length);
            memoryStream.Close();
            memoryStream.Dispose();
            memoryStream = null;

            return byteData;
        }
  Abraços Att Luiz Maia
GOSTEI 0
Fernando Reis

Fernando Reis

24/08/2009

Oi Amigo,     Pode me explicar um pouco mais,     Esta classe cria um novo arquivo com tamanho menor proporcional?   Tenho que usar esta classe na hora do Upload?       Grato              
GOSTEI 0
Luiz Maia

Luiz Maia

24/08/2009

Ola Fernando,   Este metodo deve ser usado na hora do upload mesmo. Mas ele nao gera imagem de tamanho proporcional nao. Repare na linha:   Size novoTamanhoImagem = new Size(320 , 240);
Aqui é o redimensionamento. Existem compenentes mais completos para fazer isto, mas sao pagos.   Sugiro vc usar este que te passei mesmo. Crie um padrao para suas imagens, assim fica facil alterar a dimensao.   Repare que o metodo retorna um array de bites, repois basta usar o Response.BinaryWrite.   Abraços Att Luiz Maia
GOSTEI 0
Fernando Reis

Fernando Reis

24/08/2009

Olá,   Obrigado pelo retorno       Veja abaixo algumas Dúvidas       Ola Fernando,   Este metodo deve ser usado na hora do upload mesmo. Mas ele nao gera imagem de tamanho proporcional nao. Repare na linha:   Size novoTamanhoImagem = new Size(320 , 240);   Significa que ele grava a imagem com esta altura e largura?   Se positivo, isto não causa o problema de uma imagem distorcida?      
Aqui é o redimensionamento. Existem compenentes mais completos para fazer isto, mas sao pagos.     Sugiro vc usar este que te passei mesmo. Crie um padrao para suas imagens, assim fica facil alterar a dimensao. Para que possa entender melhor, funciona desta forma, o cliente irá incluir as imagens e informações sobre cada produto e claro este não entende sobre tratamento de imagem, pixels e também sobre tamanho em Kbytes.   Meu receio é:   1.) o Cliente acrescentar uma imagem com um tamanho em Bytes muito grande o que torna o site mais lento quando realizar a consulta de produtos ( vou criar a grid que traz a imagem pequena)   2.) Este caso em específico, o cliente não posseu imagens padrão, ou seja algumas são do tipo paisagem e outras Retrato e se utilizar a questão acima elas vão distorcer com certeza!     Existe uma forma de  criar um redimensionamento com um valor padrão apenas com altura por exemplo e criar uma regra para Largura?     Repare que o metodo retorna um array de bites, repois basta usar o Response.BinaryWrite.   Queria conhecer um pouco mais sobre este assunto, tem algum artigo para ler e entender melhor esta questão de Array de Bytes?    
GOSTEI 0
Luiz Maia

Luiz Maia

24/08/2009

Ola Fernando,   Use esta função, ela redimensiona a imagem proporcionalmente:   public void ResizeImage(string OrigFile, string NewFile, int NewWidth, int MaxHeight, bool ResizeIfWider) { System.Drawing.Image FullSizeImage = System.Drawing.Image.FromFile(OrigFile); // Ensure the generated thumbnail is not being used by rotating it 360 degrees FullSizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone); FullSizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone); if (ResizeIfWider) { if (FullSizeImage.Width <= NewWidth) { NewWidth = FullSizeImage.Width; } } int NewHeight = FullSizeImage.Height * NewWidth / FullSizeImage.Width; if (NewHeight > MaxHeight) // Height resize if necessary { NewWidth = FullSizeImage.Width * MaxHeight / FullSizeImage.Height; NewHeight = MaxHeight; } // Create the new image with the sizes we've calculated System.Drawing.Image NewImage = FullSizeImage.GetThumbnailImage(NewWidth, NewHeight, null, IntPtr.Zero); FullSizeImage.Dispose(); NewImage.Save(NewFile); }   Aguardo Att Luiz Maia
GOSTEI 0
Fernando Reis

Fernando Reis

24/08/2009

Obrigado.     Pode por gentileza responder ao último questionamento?   Queria conhecer um pouco mais sobre este assunto, tem algum artigo para ler e entender melhor esta questão de Array de Bytes?   grato
GOSTEI 0
Luiz Maia

Luiz Maia

24/08/2009

Pode dar uma olhada nestes artigos:   https://www.devmedia.com.br/articles/viewcomp.asp?comp=5786 https://www.devmedia.com.br/articles/viewcomp.asp?comp=3621   Ambos usam a conversão de imagem para binario para gravar na base de dados. Depois, com uma consulta select recuperam o array de bites e renderizam a imagem na tela.   Caso não tenha acesso a algum, me avise que providencio para vc. Aguardo seu retorno.   Abraços Att Luiz Maia
GOSTEI 0
Fernando Reis

Fernando Reis

24/08/2009

Minha dúvida agora seria oseguinte,     Pode me ajudar com um exemplo em que eu  eu "leia" este arquivo e consiga trazar para uma gridview!
GOSTEI 0
Luiz Maia

Luiz Maia

24/08/2009

Como assim Fernando,   Me explique melhor por favor.   Aguardo Abraços Att Luiz Maia
GOSTEI 0
Fernando Reis

Fernando Reis

24/08/2009

Luiz         Estas imagens que iremos gravar no banco, eu quero trazer ("ler do banco de dados") e trzaer para o WebForm dentro de um gridview.     Quando utilizo a função para gravar no Banco de dados eu gravo como binario correto?   como faço para trazer este campo (binario) e fazer com que apareça em uma gridview?  pode ser dentro de uma coluna template com um objeto picture,   mas como fazer isto?   Fui mais claro?   kkkkk  
GOSTEI 0
Luiz Maia

Luiz Maia

24/08/2009

Fernando Neste caso, voce nao podera apenas exibir a imagem, desta forma nao tem como exibi-la dentro do GridView. Vc tera que salvar a mesma numa pasta temporaria e depois atribuir sua url num controle Image, dentro do GridView.   Abraços Att Luiz Maia
GOSTEI 0
Fernando Reis

Fernando Reis

24/08/2009

ok,   dúvida esclarecida
GOSTEI 0
Luiz Maia

Luiz Maia

24/08/2009

Blz Fernando, Precisando estaremos sempre a disposição.   Abraços Att Luiz Maia
GOSTEI 0
Fernando Reis

Fernando Reis

24/08/2009

Luiz     Pode me ajudar com este código,     Testei esta opção que achei na net sobre redimensionamento,   Criei um webForm   upload.aspx   acrecentei um Fileupload , um Button e um Label.     no button acrescentei este códio     try { System.Drawing.Image objImage = default(System.Drawing.Image); System.Drawing.Image objThumb = default(System.Drawing.Image); string imagem = FileUpload1.PostedFile.FileName.ToString(); objImage = System.Drawing.Image.FromFile(imagem);   int Altura = (objImage.Height / (objImage.Width / 180)); objThumb = objImage.GetThumbnailImage(180, Altura, null, System.IntPtr.Zero); objImage.Dispose(); string Thumb = @"C:\Teste";   objThumb.Save(Thumb);   lblMensagem.Text = "Salvou"; } catch (Exception) { lblMensagem.Text = "Deu Pau" ; } ele aparece uma erro de GID+   analisei a pasta (ja criada) e ele tem permissão.     oque pode ser???  
GOSTEI 0
Luiz Maia

Luiz Maia

24/08/2009

Oi Fernando,   Esta foi facil de solucionar. Peguei seu codigo e debuguei aqui, faltou a o nome do arquivo: string Thumb = @"C:\Teste\teste.gif";   Abraços Att Luiz Maia
GOSTEI 0
Luiz Maia

Luiz Maia

24/08/2009

E ai? Funcionou agora?   Abraços   Att Luiz Maia
GOSTEI 0
Luiz Maia

Luiz Maia

24/08/2009

Como não obtivemos resposta, estamos concluindo o chamado, caso a duvida persista pode re-abri-lo, ok? Estamos a sua disposição para qualquer tipo de dúvida.   Abraços Att Luiz Maia
GOSTEI 0
POSTAR