2010-06-19 37 views

Trả lời

2

C# (hay đúng hơn là: Khuôn khổ .NET) không cung cấp khả năng như vậy, nhưng nó cung cấp cho bạn Bitmap từ System.Drawing để dễ dàng truy cập dữ liệu pixel thô của các định dạng hình ảnh khác nhau. Đối với phần còn lại, hãy xem http://en.wikipedia.org/wiki/Image_scaling

2

Bộ lọc và mã cỡ mẫu miễn phí tốt.

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

Lưu ý rằng đoạn mã này không đủ, bạn phải thêm tham chiếu đến dự án (thay đổi cuối cùng là ngày 6 tháng 11 năm 2006) – itsho

0

đẹp ví dụ.

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; 
} 

Nguồn: http://mattmeisinger.com/resize-image-c-sharp

+0

Chỉ định một 'WrapMode' như trong câu trả lời của LucidObscurity g ives bạn một kết quả tốt hơn. Bạn có thể muốn thêm mã đó vào mã của mình. – 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

Tôi đang sử dụng này:

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); 
     } 
    } 
Các vấn đề liên quan