2009-11-20 3 views
1

Я хотел бы открыть файл .jpg в WPF, уменьшить его до 50%, а затем сохранить его обратно в файловую систему. Каков хороший/эффективный способ сделать это?Scale a .jpg файл в WPF

ответ

1

Если вы хотите сэкономить на использовании памяти, вы должны изучить определение DecodePixelWidth/DecodePixelHeight на BitmapImage или JpegDecoder.

Масштабирование может быть выполнено с использованием TransformedBitmap.

+0

TransformedBitmap прост в использовании - спасибо! –

0

Взгляните на ответ с наибольшим количеством оборотов до this question. Он предлагает вспомогательный класс для обработки изображений. Взгляните на функцию ResizeImage и функцию SaveJpeg.

EDIT:

Я нашел что-то более WPF специфичный here.

+0

Джеймс просил решение WPF. Другой вопрос использует решение GDI +/WinForms –

1

Я использовал здесь 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; 
}