Как я могу динамически изменять размер изображения в 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, как и раньше, или создать действие, которое передает уменьшенное изображение.

Если бы это был я, я бы создал контроллер с методом изменения размера.