2010-06-19 11 views

Antwort

2

C# (oder besser gesagt: das .NET Framework) selbst bietet keine solche Funktion, aber es bietet Ihnen Bitmap von System.Drawing, um einfach auf die Rohpixeldaten verschiedener Bildformate zuzugreifen. Für den Rest siehe http://en.wikipedia.org/wiki/Image_scaling

2

Gut freier Größenfilter und Beispielcode.

http://code.google.com/p/zrlabs-yael/

private void MakeResizedImage(string fromFile, string toFile, int maxWidth, int maxHeight) 
    { 
     int width; 
     int height; 

     using (System.Drawing.Image image = System.Drawing.Image.FromFile(fromFile)) 
     { 
      DetermineResizeRatio(maxWidth, maxHeight, image.Width, image.Height, out width, out height); 

      using (System.Drawing.Image thumbnailImage = image.GetThumbnailImage(width, height, new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback), IntPtr.Zero)) 
      { 
       if (image.Width < thumbnailImage.Width && image.Height < thumbnailImage.Height) 
        File.Copy(fromFile, toFile); 
       else 
       { 
        ImageCodecInfo ec = GetCodecInfo(); 
        EncoderParameters parms = new EncoderParameters(1); 
        parms.Param[0] = new EncoderParameter(Encoder.Compression, 40); 

        ZRLabs.Yael.BasicFilters.ResizeFilter rf = new ZRLabs.Yael.BasicFilters.ResizeFilter(); 
        //rf.KeepAspectRatio = true; 
        rf.Height = height; 
        rf.Width = width; 

        System.Drawing.Image img = rf.ExecuteFilter(System.Drawing.Image.FromFile(fromFile)); 
        img.Save(toFile, ec, parms); 
       } 
      } 
     } 
    } 
+1

Beachten Sie, dass dieses Stück Code nicht genug ist, Sie müssen einen Verweis auf das Projekt hinzufügen (letzte Änderung war am 6. November 2006) – itsho

0

Nizza Beispiel.

public static Image ResizeImage(Image sourceImage, int maxWidth, int maxHeight) 
{ 
    // Determine which ratio is greater, the width or height, and use 
    // this to calculate the new width and height. Effectually constrains 
    // the proportions of the resized image to the proportions of the original. 
    double xRatio = (double)sourceImage.Width/maxWidth; 
    double yRatio = (double)sourceImage.Height/maxHeight; 
    double ratioToResizeImage = Math.Max(xRatio, yRatio); 
    int newWidth = (int)Math.Floor(sourceImage.Width/ratioToResizeImage); 
    int newHeight = (int)Math.Floor(sourceImage.Height/ratioToResizeImage); 

    // Create new image canvas -- use maxWidth and maxHeight in this function call if you wish 
    // to set the exact dimensions of the output image. 
    Bitmap newImage = new Bitmap(newWidth, newHeight, PixelFormat.Format32bppArgb); 

    // Render the new image, using a graphic object 
    using (Graphics newGraphic = Graphics.FromImage(newImage)) 
    { 
     using (var wrapMode = new ImageAttributes()) 
     { 
      wrapMode.SetWrapMode(WrapMode.TileFlipXY); 
      newGraphic.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode); 
     } 

     // Set the background color to be transparent (can change this to any color) 
     newGraphic.Clear(Color.Transparent); 

     // Set the method of scaling to use -- HighQualityBicubic is said to have the best quality 
     newGraphic.InterpolationMode = InterpolationMode.HighQualityBicubic; 

     // Apply the transformation onto the new graphic 
     Rectangle sourceDimensions = new Rectangle(0, 0, sourceImage.Width, sourceImage.Height); 
     Rectangle destinationDimensions = new Rectangle(0, 0, newWidth, newHeight); 
     newGraphic.DrawImage(sourceImage, destinationDimensions, sourceDimensions, GraphicsUnit.Pixel); 
    } 

    // Image has been modified by all the references to it's related graphic above. Return changes. 
    return newImage; 
} 

Quelle: http://mattmeisinger.com/resize-image-c-sharp

+0

Angabe eines 'WrapMode' wie in LucidObscurity's Antwort g Ives Sie ein besseres Ergebnis. Vielleicht möchten Sie das Ihrem Code hinzufügen. – Andrew

5
public static class ImageHelper 
{ 
    /// <summary> 
    /// Resize the image to the specified width and height. 
    /// </summary> 
    /// <param name="image">The image to resize.</param> 
    /// <param name="width">The width to resize to.</param> 
    /// <param name="height">The height to resize to.</param> 
    /// <returns>The resized image.</returns> 
    public static Bitmap ResizeImage(Image image, int width, int height) 
    { 
     var destRect = new Rectangle(0, 0, width, height); 
     var destImage = new Bitmap(width, height); 

     destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution); 

     using (var graphics = Graphics.FromImage(destImage)) 
     { 
      graphics.CompositingMode = CompositingMode.SourceCopy; 
      graphics.CompositingQuality = CompositingQuality.HighQuality; 
      graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; 
      graphics.SmoothingMode = SmoothingMode.HighQuality; 
      graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; 

      using (var wrapMode = new ImageAttributes()) 
      { 
       wrapMode.SetWrapMode(WrapMode.TileFlipXY); 
       graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode); 
      } 
     } 

     return destImage; 
    } 

    public static Bitmap ResizeImage(Image image, decimal percentage) 
    { 
     int width = (int)Math.Round(image.Width * percentage, MidpointRounding.AwayFromZero); 
     int height = (int)Math.Round(image.Height * percentage, MidpointRounding.AwayFromZero); 
     return ResizeImage(image, width, height); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     string fileName = @"C:\Images\MyImage.jpg"; 
     FileInfo info = new FileInfo(fileName); 
     using (Image image = Image.FromFile(fileName)) 
     { 
      using(Bitmap resizedImage = ImageHelper.ResizeImage(image, 0.25m)) 
      { 
       resizedImage.Save(
        info.DirectoryName + "\\" 
         + info.Name.Substring(0, info.Name.LastIndexOf(info.Extension)) 
         + "_" + resizedImage.Width + "_" + resizedImage.Height 
         + info.Extension, 
        ImageFormat.Jpeg); 
      } 
     } 
    } 
} 
0

Ich verwende diese:

public static void ResizeJpg(string path, int nWidth, int nHeight) 
    { 
     using (var result = new Bitmap(nWidth, nHeight)) 
     { 
      using (var input = new Bitmap(path)) 
      { 
       using (Graphics g = Graphics.FromImage((System.Drawing.Image)result)) 
       { 
        g.DrawImage(input, 0, 0, nWidth, nHeight); 
       } 
      } 

      var ici = ImageCodecInfo.GetImageEncoders().FirstOrDefault(ie => ie.MimeType == "image/jpeg"); 
      var eps = new EncoderParameters(1); 
      eps.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L); 
      result.Save(path, ici, eps); 
     } 
    } 
Verwandte Themen