O código que irei mostrar nem precisarei de muita explicação. Você encontra a rodo aí pela internet... Contudo, esse tem um pequeno diferencial: misturei o código "pescado" da net com o incremento de Glenn Jones. O redimensionamento consiste em colocar no SRC da imagem o Generic Handler que faz todo o processo e gera a imagem. Ou seja, crie um arquivo ImageResize.ashx e coloque o seguinte código abaixo:
using System;
using System.Drawing;
using System.IO;
using System.Web;
public class ImagemHandler : IHttpHandler {
public void ProcessRequest (HttpContext context) {
// Recupera os parâmetros passados pela página
string strSrcImagemOriginal = "../upload/" + context.Request["img"].ToString();
string strAlturaImagemRedimensionar = "";
string strLarguraImagemRedimensionar = context.Request["w"].ToString();
// Cria temporariamnte a imagem
System.Drawing.Image imagemTemp = System.Drawing.Image.FromFile(context.Server.MapPath(strSrcImagemOriginal));
// Variáveis contendo o tamanho
int srcWidth = imagemTemp.Width;
int srcHeight = imagemTemp.Height;
int thumbHeight;
int thumbWidth;
// Redimensiona a largura de forma proporcional
if (context.Request["w"] != null)
{
thumbWidth = int.Parse(strLarguraImagemRedimensionar);
thumbHeight = (int)(thumbWidth * imagemTemp.Height) / imagemTemp.Width;
}
else
{
thumbWidth = imagemTemp.Width;
thumbHeight = imagemTemp.Height;
}
// Redimensiona a altura
if (context.Request["h"] != null)
{
strAlturaImagemRedimensionar = context.Request["h"].ToString();
thumbHeight = int.Parse(strAlturaImagemRedimensionar);
// Faz o rateio para o redimensionamento proporcional
// Assim a altura e a largura nunca irão ultrapassar o tamanho limite
double widthRatio = (double)imagemTemp.Width / (double)thumbWidth;
double heightRatio = (double)imagemTemp.Height / (double)thumbHeight;
double ratio = Math.Max(widthRatio, heightRatio);
thumbWidth = (int)(imagemTemp.Width / ratio);
thumbHeight = (int)(imagemTemp.Height / ratio);
}
imagemTemp.Dispose();
// Envia para a memória o objeto a ser trabalhado bem como o novo objeto
Stream objStream = new StreamReader(context.Server.MapPath(strSrcImagemOriginal)).BaseStream;
BinaryReader objBinaryReader = new BinaryReader(objStream);
int i = (int)objStream.Length;
byte[] arrBytes = objBinaryReader.ReadBytes(i);
System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(arrBytes);
System.Drawing.Image image = System.Drawing.Image.FromStream(memoryStream);
System.Drawing.Image thumbnail = new Bitmap(thumbWidth, thumbHeight);
System.Drawing.Graphics graphic = System.Drawing.Graphics.FromImage(thumbnail);
// Melhoria da nova imagem
graphic.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
graphic.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
graphic.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
graphic.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
// Desenha a nova imagem
graphic.DrawImage(image, 0, 0, thumbWidth, thumbHeight);
// Aplica a codificação necessária
System.Drawing.Imaging.ImageCodecInfo[] info = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();
System.Drawing.Imaging.EncoderParameters encoderParameters;
encoderParameters = new System.Drawing.Imaging.EncoderParameters(1);
encoderParameters.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L);
// Exibe a imagem em forma de JPG
context.Response.ContentType = "image/jpeg";
thumbnail.Save(context.Response.OutputStream, info[1], encoderParameters);
}
}
Mais dado do que isso é só de mão beijada!
4 comentários:
100 % !! Funfou legal com qualidade excelente.
Funcionou certinho, valeu!
Excelente blog Thiago, parabens, tenho uma dúvida nesse código, Como eu usuário isso no meu botão UpLoad, obrigado. Paulo R.
melhor q batat so ovo de garça
Postar um comentário