Я работаю с WPF,.NET 3.5, С#. У меня есть массив байтов в jpeg файле в памяти, загруженной из базы данных, и я хотел бы изменить его размер до меньшего размера по памяти.
Пожалуйста, помогите мне сделать это.
Быстрый поиск в Google дает статью MSDN, в которой говорится, как это сделать.
Простой пример:
System.Drawing.Image source = System.Drawing.Image.FromFile(@"Z:\Temp\temp.bmp");
System.Drawing.Image destination = new System.Drawing.Bitmap(128, 128);
using (var g = Graphics.FromImage(destination))
{
g.InterpolationMode = InterpolationMode.HighQualityBilinear;
g.DrawImage(source, new System.Drawing.Rectangle(0,0,128,128), new System.Drawing.Rectangle(0, 0,source.Width, source.Height), GraphicsUnit.Pixel);
}
destination.Save(@"Z:\Temp\outpt.png", ImageFormat.Png);
Обратите внимание, что в моем примере используются файлы, но это просто для загрузки и сохранения. Вся работа выполняется в памяти, и вы можете загружать и сохранять из потоков памяти, если это лучше подходит для вашего рабочего процесса.
Вы также можете использовать эту функцию:
public static BitmapImage BitmapImageFromBitmapSourceResized(BitmapSource bitmapSource, int newWidth)
{
BmpBitmapEncoder encoder = new BmpBitmapEncoder();
MemoryStream memoryStream = new MemoryStream();
BitmapImage bImg = new BitmapImage();
encoder.Frames.Add(BitmapFrame.Create(bitmapSource));
encoder.Save(memoryStream);
bImg.BeginInit();
bImg.StreamSource = new MemoryStream(memoryStream.ToArray());
bImg.DecodePixelWidth = newWidth;
bImg.EndInit();
memoryStream.Close();
return bImg;
}
Использование этой функции рекомендуется Microsoft, поскольку изображение не сохраняется в исходном размере, но с размером newWidth. Он может избежать переполнения памяти, если пользователь вводит огромные изображения.