Как динамически изменять размер изображения в 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?

3 ответов


вы можете определенно повторно использовать то же самое 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.


используя 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 веб-страницы (Бритва) Сайт.


вы можете сделать то же самое в MVC. Вы можете использовать httphandler, как и раньше, или создать действие, которое передает измененное изображение.

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