Ответ 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);
}