G+

Создание маленькой картинки (thumbnail images)

Программирование Asp.net
Предыдущий Следующий

Часто возникает потребность показывать большую картинку, но уменьшив ее размер и что бы при этом сохранялось ее качество. Стандартный метод не подходит

<img style="width: 468px; height: 272px"src="http://www.aspnet.com.ua/img.jpg" />

 Тогда я предлагаю создавать IHttpHandler и с помощью него делать преобразования. В Handler я буду get-запросом передавать адрес к картинке. Но как всегда не все так просто. Есть два пути решения проблемы. Первый метод подходит если на выходе мы хотим получить очень маленькую картинку

 В параметр PhotoIMG - путь к картинке, размер выходной картинка 100 на 100

Code

<%@ WebHandler Language="C#" Class="PhotoSmall" %>

using System;
using System.Web;
using System.Drawing;

public class PhotoSmall: IHttpHandler {
public void ProcessRequest (HttpContext context) {
Bitmap test;
try
{test = new Bitmap(context.Request.QueryString[«PhotoIMG»]); }
catch
{ test = new Bitmap(«noimage.jpg»);}

System.Drawing.Image.GetThumbnailImageAbort myCallback =
new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);

int width = 100;
int height = 100;

Bitmap holst = new Bitmap(width, height);
Graphics ImageGraphics = Graphics.FromImage(holst);

Image photo = test.GetThumbnailImage(width, height, myCallback, IntPtr.Zero);
ImageGraphics.DrawImage(photo, 0, 0, photo.Width, photo.Height);

using (System.IO.MemoryStream stmMemory = new System.IO.MemoryStream())
{
context.Response.Clear();
context.Response.ContentType = «image/jpeg»;
holst.Save(stmMemory, System.Drawing.Imaging.ImageFormat.Png);
stmMemory.WriteTo(context.Response.OutputStream);
context.Response.End();
}

ImageGraphics.Dispose();
}

public static bool ThumbnailCallback()
{
return false;
}

public bool IsReusable {
get {
return false;
}
}
}

 

 Следующий метод если картинка не много по больше размера например 300 на 300

 

Code

<%@ WebHandler Language="C#" Class="PhotoSmall" %>

using System;
using System.Web;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
using System.IO;

public class PhotoSmall : IHttpHandler
{
private static ImageCodecInfo getCodecInfo(string mt)
{
ImageCodecInfo[] ici = ImageCodecInfo.GetImageEncoders();
int idx = 0;
for (int ii = 0; ii < ici.Length; ii++)
{
if (ici[ii].MimeType == mt)
{
idx = ii;
break;
}
}
return ici[idx];
}

public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = «image/jpeg»;
context.Response.Clear();

System.Drawing.Image g;
try
{
g = System.Drawing.Image.FromFile(context.Request.QueryString[«PhotoIMG»]);
}
catch
{
g = System.Drawing.Image.FromFile(«noimage.jpg»);
}

int width = 300;
int height = 300;

Bitmap b = new Bitmap(width, height);

Graphics gTemp = Graphics.FromImage(b);
gTemp.InterpolationMode = InterpolationMode.Bicubic;
gTemp.PixelOffsetMode = PixelOffsetMode.HighQuality;
gTemp.DrawImage(g, 0, 0, width, height);

EncoderParameters ep = new EncoderParameters(1);
ImageCodecInfo icJPG = getCodecInfo(«image/jpeg»);

ep.Param[0] = new EncoderParameter(Encoder.Quality, (long)80);

b.Save(context.Response.OutputStream, icJPG, ep);

gTemp.Dispose();
b.Dispose();
g.Dispose();
}

public bool IsReusable {
get {
return false;
}}}

 Еще в этот код можно добавить пропорциональное изменение размера картинки. Т.е. если картинка была 100х200, то после изменения она осталась 50х100

 

Code

int ReqWidth = 0;
int ReqHeight = 0;

bool result = int.TryParse(context.Request.Params[«Width»], out ReqWidth);
int defaultWidth = 100;
if (result)
defaultWidth = ReqWidth;

int defaultHeight = 100;
result = int.TryParse(context.Request.Params[«Height»], out ReqHeight);
if (result)
defaultHeight = ReqHeight;

int width = 0;
int height = 0;

if (defaultWidth > g.Width) defaultWidth = g.Width;
else if (defaultHeight > g.Height) defaultHeight = g.Height;
float x = (float)g.Width / (float)defaultWidth;
float y = (float)g.Height / (float)defaultHeight;

if (x > y)
{
width = (int)(g.Width / x);
height = (int)(g.Height / x);
}
else
{
width = (int)(g.Width / y);
height = (int)(g.Height / y);
}
 

 

Комментарий:
Комментариев пока нету
Самостоятельный отпуск Опыт заказа вывоза мусора в Киеве