Динамическое создание миниатюрного изображения из изображения URL - PullRequest
3 голосов
/ 03 ноября 2011

Мне было интересно, есть ли у кого-нибудь код / ​​полезная ссылка, объясняющая, как я могу это сделать.Скорее всего, я бы использовал это так:

<img src="ShowThumb.aspx?image=http://the_image.jpg" alt="" />

Спасибо.

Ответы [ 2 ]

1 голос
/ 03 ноября 2011

Вы на правильном пути: я однажды сделал нечто подобное, для этого использовал только HTTP-обработчик (ashx). Там вы можете использовать класс Image для загрузки .jpg, изменения его размера и возврата.

НЕ ЗАБЫВАЙТЕ чтобы ограничить обработчик только изменением размера изображений в вашем домене, в противном случае он может стать довольно опасным (легкие DOS-атаки).

1 голос
/ 03 ноября 2011

Вместо использования файла .aspx используйте файл универсального обработчика (.ashx). Это означает, что вам нужен только 1 файл (без файла разметки), поэтому он немного аккуратнее и немного быстрее. В конце концов, вы не генерируете веб-форму, поэтому файл .aspx - это не то, что вам нужно.

Вы можете использовать System.Drawing.Graphics.DrawImage() для создания миниатюры.

Что-то простое, как это будет работать:

Bitmap bmpOut = new Bitmap(width, height);
Bitmap B = new Bitmap(context.Server.MapPath(ImageURL));

Graphics g = Graphics.FromImage(bmpOut);
g.InterpolationMode = InterpolationMode.High;
g.DrawImage(B, 0, 0, width, height);


context.Response.ContentType = "image/PNG";
MemoryStream MemStream = new MemoryStream();
B.Save(MemStream, System.Drawing.Imaging.ImageFormat.Png);

B.Dispose();

MemStream.WriteTo(HttpContext.Current.Response.OutputStream);

Где width & height - значения integer, а ImageURL - строка локального URI

Я бы не стал изменять размер вашего изображения, используя атрибуты width / height в HTML / CSS. Это означает, что вы отправляете полноразмерное изображение клиенту, тратя впустую пропускную способность и время каждого! Более того, когда HTML изменяет его размер, он обычно делает извращенную работу.


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

Поэтому, когда бы ни было загружено основное изображение, я сохранял миниатюру в физическом месте и вызывал ее в своем HTML.

...