Я хотел бы открыть файл .jpg в WPF, уменьшить его до 50%, а затем сохранить его обратно в файловую систему. Каков хороший/эффективный способ сделать это?Scale a .jpg файл в WPF
ответ
Если вы хотите сэкономить на использовании памяти, вы должны изучить определение DecodePixelWidth/DecodePixelHeight на BitmapImage или JpegDecoder.
Масштабирование может быть выполнено с использованием TransformedBitmap.
Взгляните на ответ с наибольшим количеством оборотов до this question. Он предлагает вспомогательный класс для обработки изображений. Взгляните на функцию ResizeImage
и функцию SaveJpeg
.
EDIT:
Я нашел что-то более WPF специфичный here.
Джеймс просил решение WPF. Другой вопрос использует решение GDI +/WinForms –
Я использовал здесь 2 функции. ResizeImage принимает исходное изображение как массив байтов и размер цели в пикселях. Эта функция возвращает измененное изображение в виде байтового массива. Вы можете записать его в файл.
Выполните следующие шаги
1) Считывание изображения как массив байтов с использованием BinaryReader
2) вызов функции ResizeImage путем передачи этого массива и целевой размер IMAG.
3) значение Магазин Возвращается в байтовый массив
4) записать его в файл с помощью BinaryWriter
byte[] ResizeImage(byte[] imageFile, int targetSize)
{
System.Drawing.Image oldImage = System.Drawing.Image.FromStream(new MemoryStream(imageFile));
System.Drawing.Size newSize = CalculateDimensions(oldImage.Size, targetSize);
using (System.Drawing.Bitmap newImage = new System.Drawing.Bitmap(oldImage, (int)newSize.Width, (int)newSize.Height))
{
using (System.Drawing.Graphics canvas = System.Drawing.Graphics.FromImage(newImage))
{
canvas.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
canvas.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
canvas.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
canvas.DrawImage(oldImage, new System.Drawing.Rectangle(new System.Drawing.Point(0, 0), newSize));
MemoryStream m = new MemoryStream();
newImage.Save(m, System.Drawing.Imaging.ImageFormat.Jpeg);
return m.GetBuffer();
}
}
}
System.Drawing.Size CalculateDimensions(System.Drawing.Size oldSize, int targetSize)
{
System.Drawing.Size newSize = new System.Drawing.Size();
if (oldSize.Height > oldSize.Width)
{
newSize.Width = (int)(oldSize.Width * ((float)targetSize/(float)oldSize.Height));
newSize.Height = targetSize;
}
else
{
newSize.Width = targetSize;
newSize.Height = (int)(oldSize.Height * ((float)targetSize/(float)oldSize.Width));
}
return newSize;
}
TransformedBitmap прост в использовании - спасибо! –