Как я могу динамически изменять размер изображения в ASP.NET MVC?
Вопрос
Как я могу динамически изменять размер изображения в ASP.NET MVC?
Фон
Я пытаюсь автоматически создавать эскизы изображений, которые уже находятся на сервере. В ASP.NET Webforms я создал HTTPHandler
для этого и добавил глаголы в web.config
для всех расширений изображений, которые будут проходить через обработчик. Обработчик был хорош в том, что если бы вы хотели оригинальное изображение, вы бы использовали типичный тег изображения:
<img src="pic.jpg"/>
Но если вы хотите изменить размер изображения, вы должны использовать:
<img src="pic.jpg?width=320&height=240"/>
Есть ли способ дублировать одно и то же поведение в ASP.NET MVC?
Ответы
Ответ 1
Вы можете повторно использовать один и тот же IHttpHandler
. Вам просто нужен новый IRouteHandler, чтобы сопоставить входящий запрос с правильным обработчиком:
public class ImageRouteHandler : IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return new YourImageHttphandler();
}
}
В ваших маршрутах добавьте:
routes.Add("Images", new Route("images/{*file}", new ImageRouteHandler()));
Теперь любой запрос в /images
(например, /images/pic.jpg?width=320&height=240
) будет обрабатываться вашим существующим обработчиком. Очевидно, вы можете изменить шаблон маршрута, чтобы он соответствовал любому пути, который имеет смысл, как обычный маршрут MVC.
Ответ 2
Используя класс WebImage
, который приходит в System.Web.Helpers.WebImage
, вы можете достичь этого.
Вы можете использовать этого замечательного ребенка для вывода изображений с измененным размером на лету.
Пример кода:
public void GetPhotoThumbnail(int realtyId, int width, int height)
{
// Loading photos’ info from database for specific Realty...
var photos = DocumentSession.Query<File>().Where(f => f.RealtyId == realtyId);
if (photos.Any())
{
var photo = photos.First();
new WebImage(photo.Path)
.Resize(width, height, false, true) // Resizing the image to 100x100 px on the fly...
.Crop(1, 1) // Cropping it to remove 1px border at top and left sides (bug in WebImage)
.Write();
}
// Loading a default photo for realties that don't have a Photo
new WebImage(HostingEnvironment.MapPath(@"~/Content/images/no-photo100x100.png")).Write();
}
В представлении у вас будет что-то вроде этого:
<img src="@Url.Action("GetPhotoThumbnail",
new { realtyId = item.Id, width = 100, height = 100 })" />
Подробнее об этом здесь: Изменить размер изображения на лету с помощью ASP.NET MVC
Также есть большой учебник на сайте ASP.NET: Работа с изображениями на веб-страницах ASP.NET(Razor).
Ответ 3
Вы можете сделать то же самое в mvc. Вы можете либо использовать httphandler, как и раньше, или создать действие, которое передает уменьшенное изображение.
Если бы это был я, я бы создал контроллер с методом изменения размера.