Изменение размера изображений ASP.NET MVC3 для профиля пользователя

Я хочу создать профиль пользователя с изображением. Этот пользователь может загрузить свою фотографию, в его профиле будет эта фотография, а на форуме будет небольшое изображение, созданное из оригинальной фотографии. У меня нет проблем с отображением изображения, но с изменением размера. У меня есть этот код в контроллере, где пользователь может изменить свою информацию (имя, возраст,...) и загрузить фотографию:

[HttpPost, ValidateInput(false)]
public ActionResult Upravit(int id, FormCollection collection, HttpPostedFileBase file)
{
    try
    {
        var user = repo.Retrieve(id);

        if (TryUpdateModel(user))
        {
            if (file.ContentLength > 0)
            {
                var fileName = Path.GetFileName(file.FileName);
                var path = Path.Combine(Server.MapPath("~/Fotky/Profilove/"), (user.Name.Name + " " + user.Name.Surname + Path.GetExtension(fileName)));
                file.SaveAs(path);
                user.ImagePath = "/Fotky/Profilove/" + user.Name.Name + " " + user.Name.Surname + Path.GetExtension(fileName);

            }
            repo.Save(user);
            return RedirectToAction("Index");
        }
        return View();
    }
    catch
    {
        return View();
    }
}

и мой взгляд выглядит так:

@using (Html.BeginForm("Upravit", "Uzivatel", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>User</legend>
        @Html.HiddenFor(model => model.UserID)
        <div class="editor-label">
            @Html.LabelFor(model => model.UserName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.UserName)
            @Html.ValidationMessageFor(model => model.UserName)
        </div>
        .
        .
        <input type="file" name="file" id="file" />
        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
}

Как я уже сказал, мне просто нужна помощь с добавлением кода в контроллер, который создает небольшое изображение из оригинала и сохраняет его. Спасибо за любую помощь


person Libor Zapletal    schedule 14.06.2011    source источник
comment
пример кода миниатюр. Это то, что вам нужно?   -  person Craig Stuntz    schedule 14.06.2011
comment
В параллельном потоке есть ответ, который может вас заинтересовать: stackoverflow.com/a/10420210/1716421 Вы можете использовать WebImage class из пространства имен System.Web.Helpers, чтобы сэкономить ваше время и усилия при изменении размера, обрезке и повороте изображений. надеюсь, это поможет   -  person Denys Vuika    schedule 13.10.2012


Ответы (1)


Существует огромное количество примеров изменения размера изображений в C#. Так что просто выберите один метод, который вам нравится. Вот, например, тот, на который @Craig Stuntz ссылается в качестве комментария к вашему вопросу. Если вам не нравится этот метод, просто выберите еще один и адаптировать.

if (file != null && file.ContentLength > 0)
{
    var fileName = Path.GetFileName(file.FileName);
    // TODO: adjust the filenames here
    var path = Path.Combine(Server.MapPath("~/"), fileName);
    using (var input = new Bitmap(file.InputStream))
    {
        int width; 
        int height; 
        if (input.Width > input.Height) 
        { 
            width = 128; 
            height = 128 * input.Height / input.Width; 
        } 
        else 
        { 
            height = 128; 
            width = 128 * input.Width / input.Height; 
        }
        using (var thumb = new Bitmap(width, height))
        using (var graphic = Graphics.FromImage(thumb))
        {
            graphic.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            graphic.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
            graphic.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;

            graphic.DrawImage(input, 0, 0, width, height);
            using (var output = System.IO.File.Create(path))
            {
                thumb.Save(output, System.Drawing.Imaging.ImageFormat.Jpeg);
            }
        }
    }
}
person Darin Dimitrov    schedule 14.06.2011
comment
Я не был просто уверен, как использовать эти коды с моей файловой переменной, теперь я знаю, спасибо обоим. - person Libor Zapletal; 14.06.2011
comment
Вы получите довольно большие изображения в формате JPEG, если не установите параметр качества в кодировщике... 90 лучше всего, хотя 80/85, вероятно, приемлемо для миниатюр. - person Lilith River; 27.03.2012