Как конвертировать HttpPostedFileBase в изображение?
Я использую ASP.NET MVC, и у меня есть действие, которое загружает файл. Файл загружается правильно. Но я хочу ширину и высоту изображения. Я думаю, что мне нужно преобразовать HttpPostedFileBase
в Image
сначала, а затем продолжить. Как я могу это сделать?
И, пожалуйста, дайте мне знать, если есть другой лучший способ получить ширину и высоту изображения.
2 ответа
Я использую 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
это прямоугольник исходного изображения, которое вы хотите масштабировать в новом растровом изображении (вам нужно будет вручную обработать соотношение сторон). Блок улова типичный IDisposable
использование внутри конструктора; вы сохраняете право собственности на новый IDisposable
объект до тех пор, пока он не будет возвращен (вы можете захотеть добавить это к комментариям кода).
Сохранение в формате 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);
}
Если вы уверены, что источником является изображение и не требует редактирования, вы можете сделать это легко, как описано здесь
[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 в View, добавив атрибут accept с типом MIME во входной тег
<input type="file" accept="image/*">
и скрипт проверки jQuery
$.validator.addMethod('accept', function () { return true; });
Все решение можно найти здесь