Trabalhando com imagens
Ola preciso criar uma espécie de thumbs.
eu estou usando este código
protected bool ResizeImagem(string nomeArquivo, string Caminho)
{
bool resultado = false;
int Largura = 180;
//Grande
try
{
System.Drawing.Image objImage = System.Drawing.Image.FromFile(Caminho);
int Altura = (objImage.Height / (objImage.Width / Largura));
System.Drawing.Image.GetThumbnailImageAbort dummyCallBack = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
System.Drawing.Image thumbNailImg = objImage.GetThumbnailImage(Largura, Altura, dummyCallBack, IntPtr.Zero); //dados dentro dos parenteses: largura, altura...
thumbNailImg.Save(Server.MapPath("empreendimento/imagesApartamentos/grd/" + nomeArquivo)); //onde está “thumbnail.jpg” mude para o nome desejad para a thumbnail
//fechando conexoes
thumbNailImg.Dispose();
objImage.Dispose();
resultado = true;
}
catch (Exception)
{
resultado = false;
}
}
esta funcionando normalmente,
ele defina uma largura da imagem atual e tras a altura necessária e cria um novo objeto,
mas preciso da seguinte situação
Eu posso fazer o download de variso tipos de imagens e tamanhos...retrato, paisagem com altura e largunras diferentes.
pensando desta forma preciso
1. identificar a altura e largura da imagem
2. definir onde esta o centro da imagem
3. a partir deste ponto recortar ( ou guardar, criando um novo objeto ) na forma ( altura e largura) que eu preciso, ou seja um quadrado.
um bom exemplo é quando vamos fazer um cadastro, como Wordpress, uol, MSN e fazemos o upload da imagem,
derepente aparece uma página com um quadrado para que possamos definir (ou recortar ) emcima da imagem enviada.
só quero que isto seja feito automaticamente.
Espero ter sido claro.
eu estou usando este código
protected bool ResizeImagem(string nomeArquivo, string Caminho)
{
bool resultado = false;
int Largura = 180;
//Grande
try
{
System.Drawing.Image objImage = System.Drawing.Image.FromFile(Caminho);
int Altura = (objImage.Height / (objImage.Width / Largura));
System.Drawing.Image.GetThumbnailImageAbort dummyCallBack = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
System.Drawing.Image thumbNailImg = objImage.GetThumbnailImage(Largura, Altura, dummyCallBack, IntPtr.Zero); //dados dentro dos parenteses: largura, altura...
thumbNailImg.Save(Server.MapPath("empreendimento/imagesApartamentos/grd/" + nomeArquivo)); //onde está “thumbnail.jpg” mude para o nome desejad para a thumbnail
//fechando conexoes
thumbNailImg.Dispose();
objImage.Dispose();
resultado = true;
}
catch (Exception)
{
resultado = false;
}
}
esta funcionando normalmente,
ele defina uma largura da imagem atual e tras a altura necessária e cria um novo objeto,
mas preciso da seguinte situação
Eu posso fazer o download de variso tipos de imagens e tamanhos...retrato, paisagem com altura e largunras diferentes.
pensando desta forma preciso
1. identificar a altura e largura da imagem
2. definir onde esta o centro da imagem
3. a partir deste ponto recortar ( ou guardar, criando um novo objeto ) na forma ( altura e largura) que eu preciso, ou seja um quadrado.
um bom exemplo é quando vamos fazer um cadastro, como Wordpress, uol, MSN e fazemos o upload da imagem,
derepente aparece uma página com um quadrado para que possamos definir (ou recortar ) emcima da imagem enviada.
só quero que isto seja feito automaticamente.
Espero ter sido claro.
Fernando Reis
Curtidas 0
Respostas
Fernando Reis
11/03/2010
Alguem pode ajudar???
GOSTEI 0
Fabio Mans
11/03/2010
Olá Fernando para resolver esta situação os métodos abaixo podem te ajudar.
O método CalculateDimensions faz o exatemente o que você precisa.
private static byte[] ResizeImageFile(byte[] imageFile, int targetSize)
{
using (System.Drawing.Image oldImage = System.Drawing.Image.FromStream(new MemoryStream(imageFile)))
{
Size newSize = CalculateDimensions(oldImage.Size, targetSize);
using (Bitmap newImage = new Bitmap(newSize.Width, newSize.Height, PixelFormat.Format24bppRgb))
{
using (Graphics canvas = Graphics.FromImage(newImage))
{
canvas.SmoothingMode = SmoothingMode.AntiAlias;
canvas.InterpolationMode = InterpolationMode.HighQualityBicubic;
canvas.PixelOffsetMode = PixelOffsetMode.HighQuality;
canvas.DrawImage(oldImage, new Rectangle(new Point(0, 0), newSize));
MemoryStream m = new MemoryStream();
newImage.Save(m, ImageFormat.Jpeg);
return m.GetBuffer();
}
}
}
}
private static Size CalculateDimensions(Size oldSize, int targetSize)
{
Size newSize = new Size();
if (oldSize.Height > oldSize.Width)
{
newSize.Width = (int)(oldSize.Width * ((float)targetSize / (float)oldSize.Height));
newSize.Height = targetSize;
}
else
{
newSize.Width = targetSize;
newSize.Height = (int)(oldSize.Height * ((float)targetSize / (float)oldSize.Width));
}
return newSize;
}
public static void InsertNews(string title, string summary, string news, byte[] photoOriginal,
string photosize, string legend)
{
DBAccess db = new DBAccess();
db.AddParameter("@Title", title);
db.AddParameter("@Summary", summary);
db.AddParameter("@News", news);
db.AddParameter("@PhotoOriginal", photoOriginal);
db.AddParameter("@Photo", ResizeImageFile(photoOriginal, 280));
db.AddParameter("@PhotoThumb", ResizeImageFile(photoOriginal, 80));
db.AddParameter("@PhotoSize", photosize);
db.AddParameter("@Legend", legend);
db.AddParameter("@Date", DateTime.Now);
db.AddParameter("@Author", UtilMembership.CurrentUserName);
db.ExecuteNonQuery("dev_News_Insert");
}
No meu curso de News eu explico como fazer.
Fabio
O método CalculateDimensions faz o exatemente o que você precisa.
private static byte[] ResizeImageFile(byte[] imageFile, int targetSize)
{
using (System.Drawing.Image oldImage = System.Drawing.Image.FromStream(new MemoryStream(imageFile)))
{
Size newSize = CalculateDimensions(oldImage.Size, targetSize);
using (Bitmap newImage = new Bitmap(newSize.Width, newSize.Height, PixelFormat.Format24bppRgb))
{
using (Graphics canvas = Graphics.FromImage(newImage))
{
canvas.SmoothingMode = SmoothingMode.AntiAlias;
canvas.InterpolationMode = InterpolationMode.HighQualityBicubic;
canvas.PixelOffsetMode = PixelOffsetMode.HighQuality;
canvas.DrawImage(oldImage, new Rectangle(new Point(0, 0), newSize));
MemoryStream m = new MemoryStream();
newImage.Save(m, ImageFormat.Jpeg);
return m.GetBuffer();
}
}
}
}
private static Size CalculateDimensions(Size oldSize, int targetSize)
{
Size newSize = new Size();
if (oldSize.Height > oldSize.Width)
{
newSize.Width = (int)(oldSize.Width * ((float)targetSize / (float)oldSize.Height));
newSize.Height = targetSize;
}
else
{
newSize.Width = targetSize;
newSize.Height = (int)(oldSize.Height * ((float)targetSize / (float)oldSize.Width));
}
return newSize;
}
public static void InsertNews(string title, string summary, string news, byte[] photoOriginal,
string photosize, string legend)
{
DBAccess db = new DBAccess();
db.AddParameter("@Title", title);
db.AddParameter("@Summary", summary);
db.AddParameter("@News", news);
db.AddParameter("@PhotoOriginal", photoOriginal);
db.AddParameter("@Photo", ResizeImageFile(photoOriginal, 280));
db.AddParameter("@PhotoThumb", ResizeImageFile(photoOriginal, 80));
db.AddParameter("@PhotoSize", photosize);
db.AddParameter("@Legend", legend);
db.AddParameter("@Date", DateTime.Now);
db.AddParameter("@Author", UtilMembership.CurrentUserName);
db.ExecuteNonQuery("dev_News_Insert");
}
No meu curso de News eu explico como fazer.
Fabio
GOSTEI 0
Fernando Reis
11/03/2010
Fabio,
Deixa ver se entendi,
este codigo pega uma imagem,
e cria uma outra com o tamanho definido, esta correto???
Deixa ver se entendi,
este codigo pega uma imagem,
e cria uma outra com o tamanho definido, esta correto???
GOSTEI 0
Fabio Mans
11/03/2010
Isso porém você não precisa ficar calculando as dimensões, você só passa o tamanha que precisa. Não é isso que precisa?
Fabio
Fabio
GOSTEI 0
Fernando Reis
11/03/2010
então,
na verdade não,
deixa tentar explicar
por exemplo tenh ouma foto com H180 X W240
preciso por padrão 40 X 40
se eu fizer um redimensionamento padrão a foto ficará distorcida, correto?
imagine que eu tenho um quadrado na mão de 40 x 40 coloco acima da foto, bem no meio e recorte esta imagem e faça um upload desta NOVA image.
entende?
na verdade não,
deixa tentar explicar
por exemplo tenh ouma foto com H180 X W240
preciso por padrão 40 X 40
se eu fizer um redimensionamento padrão a foto ficará distorcida, correto?
imagine que eu tenho um quadrado na mão de 40 x 40 coloco acima da foto, bem no meio e recorte esta imagem e faça um upload desta NOVA image.
entende?
GOSTEI 0
Fabio Mans
11/03/2010
Fernando os métodos que te passei fazem exatamente isso que você está precisando.
Tenho uma imagem 896x724 - Está perfeita
Quero corta-la e que ela fique com o tamanho de 230Xpor"naoseiovalor".
O método irá recortar e manter a proporção para que a imagem na tenha distorções.
Faça um teste nos métodos que te passei, assista meus vídoes no curso de News.
Se eu não me engano o curso é este
https://www.devmedia.com.br/articles/viewcomp.asp?comp=5453
Abs
GOSTEI 0
Fabio Mans
11/03/2010
40x40 ela irá distorcer, com certeza, não tem a mesma proporção.
Faça teste no Photoshop.
Você tem que informar o valor inicial perceba que o Photoshop ajusta sozinho, é a mesma coisa que o método faz.
===============================================================
por exemplo tenh ouma foto com H180 X W240 preciso por padrão 40 X 40
GOSTEI 0
Fernando Reis
11/03/2010
Fabio,
Desculpe minha "ignorância"
Mas pelo que li , ainda acho que não fui claro..
vou tentar novamente. ( me permita)
Tenho uma imagem de Height :100 X 200 Width:.
o Centro desta imagem esta em 50 H e 100 W.
a partir deste ponto CENTRAL
quero criar uma nova imagem com : 20 Pixels para direita e esquerda e 20 Pixel Baixo e Acima.
Não quero DIMENSIONAR A IMAGEM.
seria como ....... recortar a imagem...entende?
quero pegar a imagem original e recortar 40x40 bem no meio dela. sem me preocupara com distorção....
Vi um exemplo que trabalhava com uma expressão chamada "Rectangle",
sera isto?
Desculpe minha "ignorância"
Mas pelo que li , ainda acho que não fui claro..
vou tentar novamente. ( me permita)
Tenho uma imagem de Height :100 X 200 Width:.
o Centro desta imagem esta em 50 H e 100 W.
a partir deste ponto CENTRAL
quero criar uma nova imagem com : 20 Pixels para direita e esquerda e 20 Pixel Baixo e Acima.
Não quero DIMENSIONAR A IMAGEM.
seria como ....... recortar a imagem...entende?
quero pegar a imagem original e recortar 40x40 bem no meio dela. sem me preocupara com distorção....
Vi um exemplo que trabalhava com uma expressão chamada "Rectangle",
sera isto?
GOSTEI 0
Fabio Mans
11/03/2010
Entendi.
Se eu pegar uma foto quer cortar somente o centro, é isso?
Veja se a idéia é esta?
http://hubpages.com/hub/c-crop-image-to-a-Thumbnail
Ou
http://www.codeproject.com/KB/GDI-plus/imageresize.aspx
GOSTEI 0
Fernando Reis
11/03/2010
OI
É O PRIMEIRO,
VALEU,
DEU CERTINHO
É O PRIMEIRO,
VALEU,
DEU CERTINHO
GOSTEI 0