2009-11-20 14 views

Répondre

1

Si vous voulez économiser sur l'utilisation de la mémoire, vous devriez chercher à spécifier DecodePixelWidth/DecodePixelHeight sur BitmapImage ou le JpegDecoder.

La mise à l'échelle peut être effectuée en utilisant TransformedBitmap.

+0

TransformedBitmap était facile à utiliser - merci! –

0

Jetez un oeil à la réponse avec le plus upvotes à this question. Il offre une classe d'aide pour manipuler des images. Jetez un oeil à la fonction ResizeImage et la fonction SaveJpeg.

EDIT:

J'ai trouvé quelque chose here plus spécifique WPF.

+0

James demandait solution WPF. L'autre question utilise une solution GDI +/WinForms –

1

J'ai utilisé 2 fonctions ici. ResizeImage accepte l'image originale comme Byte Array et la taille cible en pixels. Cette fonction renvoie l'image redimensionnée en tant que tableau d'octets. Vous pouvez l'écrire dans un fichier.

Suivez ces étapes

1) Image Lire comme tableau d'octets en utilisant BinaryReader

2) Appel de la fonction ResizeImage par passage de ce tableau et la taille cible de imag.

3) Valeur renvoyée magasin en tableau d'octets

4) Ecrire à déposer en utilisant 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; 
}