- Ваш текущий код будет пропускать ресурсы при возникновении исключений. Вы всегда должны делать вызовы к
.Dispose
в блоке finally или catch (в зависимости от того, всегда ли ресурс нуждается в утилизации или только в случае ошибки). попробуй ... наконец, Dispose можно кратко записать с помощью ключевого слова using
- избавь себя от головной боли в будущем и попробуй поместить все IDisposables в блок using
или try..catch
.
- Для изменения размера изображений с помощью Windows Forms по умолчанию будет использоваться некачественный ресамплер. Это обычно приводит к плохо выглядящему результату; вам нужно специально установить соответствующий режим интерполяции (см. код ниже).
- Если вы сохраняете изображения, у вас могут возникнуть проблемы с настройками кодека изображения: например, кодер jpeg по умолчанию имеет ужасно низкое качество вывода по умолчанию. Это также вам нужно будет установить вручную (см. Ниже).
- Наконец, сохранение файла на диск или в базу данных - действительно самая легкая часть всего этого - вместо сохранения в потоке памяти просто выберите параметр потока. Этот параметр затем может быть создан для записи в файл или базу данных в соответствии с потребностями вызывающей стороны.
Я использую следующую функцию для изменения размера изображений (это изменит соотношение сторон):
public static Bitmap Resize(Image oldImage, int newWidth, int newHeight)
{
Bitmap bitmap = null;
try
{
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));
}
}
catch
{
if (bitmap != null) bitmap.Dispose();
throw;
}
return bitmap;
}
Сохранение файла в формате jpeg может быть выполнено, например, с помощью:
public static void SaveImageAsJpeg(Image image, Stream outputStream, int quality)
{
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);
}
}
, который вы могли бы использовать через что-то вроде ...
using(var origImage=Image.FromStream(inputStream, true, true))
{
//set newWidth, newHeight however you wish; determine outputFilePath
using(var newImage = Resize(origImage, newWidth, newHeight))
using(var outputStream = File.Open(outputFilePath, FileMode.Create))
SaveImageAsJpeg(newImage,outputStream, 90);
}