Upload e redimensionamento
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
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
Curtidas 0
Respostas
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
{
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
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
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
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
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?
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
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
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
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
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
24/08/2009
Como assim Fernando,
Me explique melhor por favor.
Aguardo
Abraços
Att
Luiz Maia
GOSTEI 0
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
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
24/08/2009
ok,
dúvida esclarecida
GOSTEI 0
Luiz Maia
24/08/2009
Blz Fernando,
Precisando estaremos sempre a disposição.
Abraços
Att
Luiz Maia
GOSTEI 0
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
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
24/08/2009
E ai? Funcionou agora?
Abraços
Att
Luiz Maia
GOSTEI 0
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