Как вы конвертируете HttpPostedFileBase в изображение?

Я использую ASP.NET MVC, и у меня есть действие, которое загружает файл. Файл загружается должным образом. Но я хочу ширину и высоту изображения. Я думаю, мне нужно сначала преобразовать HttpPostedFileBase в Image, а затем продолжить. Как это сделать?

И, пожалуйста, дайте мне знать, есть ли еще один лучший способ получить ширину и высоту изображения.

Ответ 1

Я использую Image.FromStream следующим образом:

Image.FromStream(httpPostedFileBase.InputStream, true, true)

Обратите внимание, что возвращенный Image - IDisposable.

Для этого вам понадобится ссылка на System.Drawing.dll, а Image - в пространстве имен System.Drawing.

Изменение размера изображения

Я не уверен, что вы пытаетесь сделать, но если вы делаете эскизы или что-то подобное, вам может быть интересно сделать что-то вроде...

try {
    var bitmap = new Bitmap(newWidth,newHeight);
    using (Graphics g = Graphics.FromImage(bitmap)) {
        g.SmoothingMode = SmoothingMode.HighQuality;
        g.PixelOffsetMode = PixelOffsetMode.HighQuality;
        g.CompositingQuality = CompositingQuality.HighQuality;
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
        g.DrawImage(oldImage,
            new Rectangle(0,0,newWidth,newHeight),
            clipRectangle, GraphicsUnit.Pixel);
    }//done with drawing on "g"
    return bitmap;//transfer IDisposable ownership
} catch { //error before IDisposable ownership transfer
    if (bitmap != null) bitmap.Dispose();
    throw;
}

где clipRectangle - это прямоугольник исходного изображения, которое вы хотите масштабировать в новом растровом изображении (вам нужно будет вручную обработать соотношение сторон). Блоком catch является типичное использование IDisposable внутри конструктора; вы сохраняете право собственности на новый объект IDisposable до тех пор, пока он не будет возвращен (вы можете захотеть doc с комментариями кода).

Сохранение как Jpeg

К сожалению, кодер "save as jpeg" по умолчанию не предоставляет никаких элементов управления качеством и выбирает ужасно низкое качество по умолчанию.

Вы также можете вручную выбрать кодировщик, а затем вы можете передать произвольные параметры:

ImageCodecInfo jpgInfo = ImageCodecInfo.GetImageEncoders()
    .Where(codecInfo => codecInfo.MimeType == "image/jpeg").First();
using (EncoderParameters encParams = new EncoderParameters(1))
{
    encParams.Param[0] = new EncoderParameter(Encoder.Quality, (long)quality);
    //quality should be in the range [0..100]
    image.Save(outputStream, jpgInfo, encParams);
}

Ответ 2

Если вы уверены, что источник изображения и не нуждается в редактировании, вы можете сделать это легко, как описано здесь

[HttpPost]
public void Index(HttpPostedFileBase file)
{
    if (file.ContentLength > 0)
    {
        var filename = Path.GetFileName(file.FileName);

        System.Drawing.Image sourceimage =
            System.Drawing.Image.FromStream(file.InputStream);
    }
}

Чтобы защитить файл - это изображение, добавьте проверку JavaScript для просмотра, добавив атрибут accept с типом MIME для ввода тега

<input type="file" accept="image/*">

и проверка jQuery script

$.validator.addMethod('accept', function () { return true; });

Все решение можно найти здесь