Cách thay đổi kích thước hình ảnh C #


288

Như Size, WidthHeightGet()tài sản của System.Drawing.Image;
Làm cách nào để thay đổi kích thước một đối tượng Image trong thời gian chạy trong C #?

Ngay bây giờ, tôi chỉ đang tạo một cái mới Imagebằng cách sử dụng:

// objImage is the original Image
Bitmap objBitmap = new Bitmap(objImage, new Size(227, 171));

2
Không đúng cách ... sử dụng phép nội suy chất lượng thấp và có thể khiến luồng ban đầu bị khóa trong suốt thời gian của hình ảnh bitmap mới ... Đọc danh sách thay đổi kích thước hình ảnh trước khi thực hiện giải pháp thay đổi kích thước hình ảnh của riêng bạn.
Sông Lilith

2
Bỏ đi mà! Sử dụng () {} hoạt động!
Scott Coates

8
Nếu những câu trả lời này hữu ích, hãy xem xét đánh dấu câu trả lời được chấp nhận.
Joel

3
Không cần sử dụng bất kỳ thư viện bổ sung. Mã được đăng dưới đây của Mark hoạt động hoàn hảo.
Elmue

9
Mark là ai? Tôi không tìm thấy câu trả lời của anh ấy, nhưng có 3 bình luận đề cập đến nó.
Sinatr

Câu trả lời:


490

Điều này sẽ thực hiện thay đổi kích thước chất lượng cao:

/// <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;
}
  • wrapMode.SetWrapMode(WrapMode.TileFlipXY) ngăn bóng mờ xung quanh viền hình ảnh - thay đổi kích thước ngây thơ sẽ lấy mẫu các pixel trong suốt vượt ra ngoài ranh giới hình ảnh, nhưng bằng cách phản chiếu hình ảnh, chúng ta có thể có được một mẫu tốt hơn (cài đặt này rất đáng chú ý)
  • destImage.SetResolution duy trì DPI bất kể kích thước vật lý - có thể tăng chất lượng khi giảm kích thước hình ảnh hoặc khi in
  • Điều khiển kết hợp cách các pixel được trộn với nền - có thể không cần thiết vì chúng ta chỉ vẽ một thứ.
    • graphics.CompositingModexác định xem các pixel từ một hình ảnh nguồn ghi đè hoặc được kết hợp với các pixel nền. SourceCopyxác định rằng khi một màu được hiển thị, nó sẽ ghi đè lên màu nền.
    • graphics.CompositingQuality xác định mức chất lượng kết xuất của hình ảnh lớp.
  • graphics.InterpolationMode xác định cách tính giá trị trung gian giữa hai điểm cuối
  • graphics.SmoothingMode chỉ định xem các đường, đường cong và các cạnh của các khu vực được lấp đầy có sử dụng làm mịn không (còn được gọi là khử răng cưa) - có lẽ chỉ hoạt động trên các vectơ
  • graphics.PixelOffsetMode ảnh hưởng đến chất lượng kết xuất khi vẽ hình ảnh mới

Duy trì tỷ lệ khung hình là một bài tập cho người đọc (thực ra, tôi chỉ không nghĩ rằng đây là công việc của chức năng này để làm điều đó cho bạn).

Ngoài ra, đây là một bài viết tốt mô tả một số cạm bẫy với thay đổi kích thước hình ảnh. Các chức năng trên sẽ bao gồm hầu hết trong số họ, nhưng bạn vẫn phải lo lắng về việc tiết kiệm .


4
mã hoạt động hoàn hảo khi thay đổi kích thước hình ảnh nhưng tăng kích thước từ 66KB lên 132 KB. Tôi có thể giảm bớt không
chamara

3
@chamara Đó có thể là do tiết kiệm chất lượng bạn đã chọn. Xem msdn.microsoft.com/en-us/l
Library / bb882583 (v

3
@kstub Bạn chắc chắn là có. Bitmapvề cơ bản chỉ là tên của lớp, bạn có thể lưu nó dưới dạng bất kỳ loại tệp nào bạn thích.
mở cửa

5
@dotNetBlackBelt Có lẽ bạn cần thêm một tài liệu tham khảo System.Drawingvà thêmusing System.Drawing.Imaging;
mpen

2
Điều này sẽ không duy trì tỷ lệ khung hình ban đầu phải không?
Kasper Skov

148

Không chắc chắn điều gì là khó khăn về vấn đề này, hãy làm những gì bạn đang làm, sử dụng hàm tạo Bitmap bị quá tải để tạo một hình ảnh có kích thước lại, điều duy nhất bạn thiếu là chuyển về kiểu dữ liệu Ảnh:

    public static Image resizeImage(Image imgToResize, Size size)
    {
       return (Image)(new Bitmap(imgToResize, size));
    }

    yourImage = resizeImage(yourImage, new Size(50,50));

2
Bạn không nên vứt bỏ yourImagetrước khi gán nó cho hình ảnh mới?
Nick Shaw

3
Bạn có thể xử lý nó bằng tay hoặc bạn có thể để người dọn rác làm việc. Không vấn đề.
Elmue

23
Mã này không kiểm soát chất lượng thay đổi kích thước, điều này rất quan trọng. Hãy xem câu trả lời từ Mark.
Elmue

42

trong câu hỏi này , bạn sẽ có một số câu trả lời, bao gồm cả câu trả lời của tôi:

public Image resizeImage(int newWidth, int newHeight, string stPhotoPath)
 {
     Image imgPhoto = Image.FromFile(stPhotoPath); 

     int sourceWidth = imgPhoto.Width;
     int sourceHeight = imgPhoto.Height;

     //Consider vertical pics
    if (sourceWidth < sourceHeight)
    {
        int buff = newWidth;

        newWidth = newHeight;
        newHeight = buff;
    }

    int sourceX = 0, sourceY = 0, destX = 0, destY = 0;
    float nPercent = 0, nPercentW = 0, nPercentH = 0;

    nPercentW = ((float)newWidth / (float)sourceWidth);
    nPercentH = ((float)newHeight / (float)sourceHeight);
    if (nPercentH < nPercentW)
    {
        nPercent = nPercentH;
        destX = System.Convert.ToInt16((newWidth -
                  (sourceWidth * nPercent)) / 2);
    }
    else
    {
        nPercent = nPercentW;
        destY = System.Convert.ToInt16((newHeight -
                  (sourceHeight * nPercent)) / 2);
    }

    int destWidth = (int)(sourceWidth * nPercent);
    int destHeight = (int)(sourceHeight * nPercent);


    Bitmap bmPhoto = new Bitmap(newWidth, newHeight,
                  PixelFormat.Format24bppRgb);

    bmPhoto.SetResolution(imgPhoto.HorizontalResolution,
                 imgPhoto.VerticalResolution);

    Graphics grPhoto = Graphics.FromImage(bmPhoto);
    grPhoto.Clear(Color.Black);
    grPhoto.InterpolationMode =
        System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

    grPhoto.DrawImage(imgPhoto,
        new Rectangle(destX, destY, destWidth, destHeight),
        new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight),
        GraphicsUnit.Pixel);

    grPhoto.Dispose();
    imgPhoto.Dispose();
    return bmPhoto;
}

5
Bạn đã quên imgPhoto.Dispose (); các tập tin được giữ trong sử dụng
shrutyzet

1
Điều này rất hữu ích, và tôi đang sử dụng điều này trong ứng dụng của mình. Tuy nhiên, điều quan trọng cần lưu ý là thuật toán này không hoạt động với hình ảnh trong suốt .. Nó biến tất cả các pixel trong suốt thành màu đen. Nó có thể dễ dàng để sửa chữa, nhưng nó chỉ là một lưu ý cho người dùng. :)
meme

1
Bạn có cho rằng để lưu hình ảnh không? imgPhoto.Save ()?
Whiplash

@meme Bạn có thể cung cấp liên kết về cách sửa nền đen đó cho tài liệu trong suốt.
Syed Mohamed

25

Tại sao không sử dụng System.Drawing.Image.GetThumbnailImagephương pháp?

public Image GetThumbnailImage(
    int thumbWidth, 
    int thumbHeight, 
    Image.GetThumbnailImageAbort callback, 
    IntPtr callbackData)

Thí dụ:

Image originalImage = System.Drawing.Image.FromStream(inputStream, true, true);
Image resizedImage = originalImage.GetThumbnailImage(newWidth, (newWidth * originalImage.Height) / originalWidth, null, IntPtr.Zero);
resizedImage.Save(imagePath, ImageFormat.Png);

Nguồn: http://msdn.microsoft.com/en-us/l Library / system.drawing.image.getthumbnailimage.aspx


6
Đây không phải là cách chính xác để thay đổi kích thước hình ảnh. Điều này kéo một hình thu nhỏ từ jpg nếu nó tồn tại. Nếu nó không tồn tại, bạn không kiểm soát được chất lượng hoặc hình ảnh mới. Ngoài ra, mã này là có rò rỉ bộ nhớ.
Robert Smith

1
@Bobrot Tại sao điều này sẽ gây rò rỉ bộ nhớ?
người dùng

2
Mọi thứ trong thư viện GDI vẫn đang chạy không được quản lý. Không sử dụng câu lệnh sử dụng hoặc xử lý các đối tượng sau đó, có thể mất nhiều thời gian để hệ thống thu gom rác các đối tượng đó và làm cho bộ nhớ trở lại.
Robert Smith

9
Như bạn nói: Có thể mất nhiều thời gian. Nhưng đây KHÔNG phải là rò rỉ bộ nhớ. Nó sẽ bị rò rỉ bộ nhớ nếu bộ nhớ KHÔNG BAO GIỜ được giải phóng. Nhưng đây là hành vi BÌNH THƯỜNG của trình thu gom rác mà nó giải phóng bộ nhớ khi CPU không hoạt động. Câu lệnh using () không ngăn chặn rò rỉ bộ nhớ. Nó chỉ giải phóng bộ nhớ ngay lập tức trong khi trình thu gom rác giải phóng bộ nhớ khi có thời gian để làm điều đó. Đó là sự khác biệt duy nhất trong trường hợp cụ thể này.
Elmue

Xem những cạm bẫy của việc thay đổi kích thước hình ảnh: nathanaeljones.com/blog/2009/20-image-resizing-pit thác "Sử dụng GetThumbnailImage (). GetThumbnailImage () dường như là sự lựa chọn rõ ràng và nhiều bài viết khuyên bạn nên sử dụng nó. Một số hình ảnh có một số hình ảnh, một số hình ảnh không có - nó thường phụ thuộc vào máy ảnh của bạn. Bạn sẽ tự hỏi tại sao GetThumbnailImage hoạt động tốt trên một số ảnh, nhưng trên những bức ảnh khác lại bị mờ một cách khủng khiếp. hơn 10px x 10px vì lý do đó. "
Nick Họa sĩ

12

Bạn có thể thử net-vips , liên kết C # cho libvips . Đó là một thư viện xử lý hình ảnh lười biếng, phát trực tuyến, theo nhu cầu, vì vậy nó có thể thực hiện các hoạt động như thế này mà không cần phải tải toàn bộ hình ảnh.

Ví dụ, nó đi kèm với một hình thu nhỏ hình ảnh tiện dụng:

Image image = Image.Thumbnail("image.jpg", 300, 300);
image.WriteToFile("my-thumbnail.jpg");

Nó cũng hỗ trợ crop thông minh, một cách xác định thông minh phần quan trọng nhất của hình ảnh và giữ nó trong tiêu cự trong khi cắt xén hình ảnh. Ví dụ:

Image image = Image.Thumbnail("owl.jpg", 128, crop: "attention");
image.WriteToFile("tn_owl.jpg");

Trường hợp owl.jpgmột thành phần ngoài trung tâm:

Cú

Cho kết quả này:

Cây thông minh cú

Đầu tiên, nó thu nhỏ hình ảnh để có được trục dọc thành 128 pixel, sau đó cắt xuống 128 pixel bằng cách sử dụng attentionchiến lược. Cái này tìm kiếm hình ảnh cho các tính năng có thể bắt mắt người, xem Smartcrop()chi tiết.


Ràng buộc của bạn cho libvips có vẻ tuyệt vời. Tôi chắc chắn sẽ xem xét lib của bạn. Cảm ơn đã cung cấp tính năng này cho Nhà phát triển C #!
FrenchTastic

Điều này thật tuyệt vời! Tôi không biết một thư viện xử lý ảnh có thể trông tốt thế này.
dalvir

đẹp! tốt hơn ImageMagick nặng
Moshe L

10

Điều này sẽ -

  • Thay đổi kích thước chiều rộng VÀ chiều cao mà không cần vòng lặp
  • Không vượt quá kích thước ban đầu của hình ảnh

//////////////

private void ResizeImage(Image img, double maxWidth, double maxHeight)
{
    double resizeWidth = img.Source.Width;
    double resizeHeight = img.Source.Height;

    double aspect = resizeWidth / resizeHeight;

    if (resizeWidth > maxWidth)
    {
        resizeWidth = maxWidth;
        resizeHeight = resizeWidth / aspect;
    }
    if (resizeHeight > maxHeight)
    {
        aspect = resizeWidth / resizeHeight;
        resizeHeight = maxHeight;
        resizeWidth = resizeHeight * aspect;
    }

    img.Width = resizeWidth;
    img.Height = resizeHeight;
}

11
OP đã hỏi về System.Drawing.Image, nơi mã của bạn sẽ không hoạt động vì các thuộc tính 'Chiều rộng' và 'Chiều cao' không thể giải quyết được. Tuy nhiên, nó sẽ hoạt động cho System.Windows.Controls.Image.
mmmdreg

10
public static Image resizeImage(Image image, int new_height, int new_width)
{
    Bitmap new_image = new Bitmap(new_width, new_height);
    Graphics g = Graphics.FromImage((Image)new_image );
    g.InterpolationMode = InterpolationMode.High;
    g.DrawImage(image, 0, 0, new_width, new_height);
    return new_image;
}

Bạn quên vứt đồ họa. Có vẻ như nguyên tắc tương tự như Bitmap mới (hình ảnh, chiều rộng, chiều cao) với chế độ nội suy tốt hơn. Tôi tò mò mặc định là gì? Nó thậm chí còn tồi tệ hơn Low?
Sinatr

9

Mã này giống như được đăng từ một trong những câu trả lời ở trên .. nhưng sẽ chuyển đổi pixel trong suốt sang màu trắng thay vì màu đen ... Cảm ơn :)

    public Image resizeImage(int newWidth, int newHeight, string stPhotoPath)
    {
        Image imgPhoto = Image.FromFile(stPhotoPath);

        int sourceWidth = imgPhoto.Width;
        int sourceHeight = imgPhoto.Height;

        //Consider vertical pics
        if (sourceWidth < sourceHeight)
        {
            int buff = newWidth;

            newWidth = newHeight;
            newHeight = buff;
        }

        int sourceX = 0, sourceY = 0, destX = 0, destY = 0;
        float nPercent = 0, nPercentW = 0, nPercentH = 0;

        nPercentW = ((float)newWidth / (float)sourceWidth);
        nPercentH = ((float)newHeight / (float)sourceHeight);
        if (nPercentH < nPercentW)
        {
            nPercent = nPercentH;
            destX = System.Convert.ToInt16((newWidth -
                      (sourceWidth * nPercent)) / 2);
        }
        else
        {
            nPercent = nPercentW;
            destY = System.Convert.ToInt16((newHeight -
                      (sourceHeight * nPercent)) / 2);
        }

        int destWidth = (int)(sourceWidth * nPercent);
        int destHeight = (int)(sourceHeight * nPercent);


        Bitmap bmPhoto = new Bitmap(newWidth, newHeight,
                      PixelFormat.Format24bppRgb);

        bmPhoto.SetResolution(imgPhoto.HorizontalResolution,
                     imgPhoto.VerticalResolution);

        Graphics grPhoto = Graphics.FromImage(bmPhoto);
        grPhoto.Clear(Color.White);
        grPhoto.InterpolationMode =
            System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

        grPhoto.DrawImage(imgPhoto,
            new Rectangle(destX, destY, destWidth, destHeight),
            new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight),
            GraphicsUnit.Pixel);

        grPhoto.Dispose();
        imgPhoto.Dispose();

        return bmPhoto;
    }

7

Trong ứng dụng tôi đã thực hiện cần thiết phải tạo một hàm với nhiều tùy chọn. Nó khá lớn, nhưng nó thay đổi kích thước hình ảnh, có thể giữ tỷ lệ khung hình và có thể cắt các cạnh để chỉ trả về trung tâm của hình ảnh:

/// <summary>
    /// Resize image with a directory as source
    /// </summary>
    /// <param name="OriginalFileLocation">Image location</param>
    /// <param name="heigth">new height</param>
    /// <param name="width">new width</param>
    /// <param name="keepAspectRatio">keep the aspect ratio</param>
    /// <param name="getCenter">return the center bit of the image</param>
    /// <returns>image with new dimentions</returns>
    public Image resizeImageFromFile(String OriginalFileLocation, int heigth, int width, Boolean keepAspectRatio, Boolean getCenter)
    {
        int newheigth = heigth;
        System.Drawing.Image FullsizeImage = System.Drawing.Image.FromFile(OriginalFileLocation);

        // Prevent using images internal thumbnail
        FullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
        FullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);

        if (keepAspectRatio || getCenter)
        {
            int bmpY = 0;
            double resize = (double)FullsizeImage.Width / (double)width;//get the resize vector
            if (getCenter)
            {
                bmpY = (int)((FullsizeImage.Height - (heigth * resize)) / 2);// gives the Y value of the part that will be cut off, to show only the part in the center
                Rectangle section = new Rectangle(new Point(0, bmpY), new Size(FullsizeImage.Width, (int)(heigth * resize)));// create the section to cut of the original image
                //System.Console.WriteLine("the section that will be cut off: " + section.Size.ToString() + " the Y value is minimized by: " + bmpY);
                Bitmap orImg = new Bitmap((Bitmap)FullsizeImage);//for the correct effect convert image to bitmap.
                FullsizeImage.Dispose();//clear the original image
                using (Bitmap tempImg = new Bitmap(section.Width, section.Height))
                {
                    Graphics cutImg = Graphics.FromImage(tempImg);//              set the file to save the new image to.
                    cutImg.DrawImage(orImg, 0, 0, section, GraphicsUnit.Pixel);// cut the image and save it to tempImg
                    FullsizeImage = tempImg;//save the tempImg as FullsizeImage for resizing later
                    orImg.Dispose();
                    cutImg.Dispose();
                    return FullsizeImage.GetThumbnailImage(width, heigth, null, IntPtr.Zero);
                }
            }
            else newheigth = (int)(FullsizeImage.Height / resize);//  set the new heigth of the current image
        }//return the image resized to the given heigth and width
        return FullsizeImage.GetThumbnailImage(width, newheigth, null, IntPtr.Zero);
    }

Để dễ dàng tích lũy chức năng, có thể thêm một số chức năng bị quá tải:

/// <summary>
    /// Resize image with a directory as source
    /// </summary>
    /// <param name="OriginalFileLocation">Image location</param>
    /// <param name="heigth">new height</param>
    /// <param name="width">new width</param>
    /// <returns>image with new dimentions</returns>
    public Image resizeImageFromFile(String OriginalFileLocation, int heigth, int width)
    {
        return resizeImageFromFile(OriginalFileLocation, heigth, width, false, false);
    }

    /// <summary>
    /// Resize image with a directory as source
    /// </summary>
    /// <param name="OriginalFileLocation">Image location</param>
    /// <param name="heigth">new height</param>
    /// <param name="width">new width</param>
    /// <param name="keepAspectRatio">keep the aspect ratio</param>
    /// <returns>image with new dimentions</returns>
    public Image resizeImageFromFile(String OriginalFileLocation, int heigth, int width, Boolean keepAspectRatio)
    {
        return resizeImageFromFile(OriginalFileLocation, heigth, width, keepAspectRatio, false);
    }

Bây giờ là hai booleans cuối cùng tùy chọn để thiết lập. Gọi hàm như thế này:

System.Drawing.Image ResizedImage = resizeImageFromFile(imageLocation, 800, 400, true, true);

6
public string CreateThumbnail(int maxWidth, int maxHeight, string path)
{

    var image = System.Drawing.Image.FromFile(path);
    var ratioX = (double)maxWidth / image.Width;
    var ratioY = (double)maxHeight / image.Height;
    var ratio = Math.Min(ratioX, ratioY);
    var newWidth = (int)(image.Width * ratio);
    var newHeight = (int)(image.Height * ratio);
    var newImage = new Bitmap(newWidth, newHeight);
    Graphics thumbGraph = Graphics.FromImage(newImage);

    thumbGraph.CompositingQuality = CompositingQuality.HighQuality;
    thumbGraph.SmoothingMode = SmoothingMode.HighQuality;
    //thumbGraph.InterpolationMode = InterpolationMode.HighQualityBicubic;

    thumbGraph.DrawImage(image, 0, 0, newWidth, newHeight);
    image.Dispose();

    string fileRelativePath = "newsizeimages/" + maxWidth + Path.GetFileName(path);
    newImage.Save(Server.MapPath(fileRelativePath), newImage.RawFormat);
    return fileRelativePath;
}

Bấm vào đây http://bhupendrasinghsaini.blogspot.in/2014/07/resize-image-in-c.html


6

Đây là mã mà tôi đã thực hiện cho một yêu cầu cụ thể, ví dụ: đích luôn ở tỷ lệ ngang. Nó sẽ cho bạn một khởi đầu tốt.

public Image ResizeImage(Image source, RectangleF destinationBounds)
{
    RectangleF sourceBounds = new RectangleF(0.0f,0.0f,(float)source.Width, (float)source.Height);
    RectangleF scaleBounds = new RectangleF();

    Image destinationImage = new Bitmap((int)destinationBounds.Width, (int)destinationBounds.Height);
    Graphics graph = Graphics.FromImage(destinationImage);
    graph.InterpolationMode =
        System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

    // Fill with background color
    graph.FillRectangle(new SolidBrush(System.Drawing.Color.White), destinationBounds);

    float resizeRatio, sourceRatio;
    float scaleWidth, scaleHeight;

    sourceRatio = (float)source.Width / (float)source.Height;

    if (sourceRatio >= 1.0f)
    {
        //landscape
        resizeRatio = destinationBounds.Width / sourceBounds.Width;
        scaleWidth = destinationBounds.Width;
        scaleHeight = sourceBounds.Height * resizeRatio;
        float trimValue = destinationBounds.Height - scaleHeight;
        graph.DrawImage(source, 0, (trimValue / 2), destinationBounds.Width, scaleHeight);
    }
    else
    {
        //portrait
        resizeRatio = destinationBounds.Height/sourceBounds.Height;
        scaleWidth = sourceBounds.Width * resizeRatio;
        scaleHeight = destinationBounds.Height;
        float trimValue = destinationBounds.Width - scaleWidth;
        graph.DrawImage(source, (trimValue / 2), 0, scaleWidth, destinationBounds.Height);
    }

    return destinationImage;

}

Tuyệt vời!!! Tôi đã gặp rắc rối trong một bức ảnh chân dung và sau khi thử nhiều giải pháp tìm kiếm trên web, đây là CHỈ CÓ HOÀN HẢO! CẢM ƠN BẠN RẤT NHIỀU!
Fábio

3

Nếu bạn đang làm việc với BitmapSource:

var resizedBitmap = new TransformedBitmap(
    bitmapSource,
    new ScaleTransform(scaleX, scaleY));

Nếu bạn muốn kiểm soát chất lượng tốt hơn, hãy chạy cái này trước:

RenderOptions.SetBitmapScalingMode(
    bitmapSource,
    BitmapScalingMode.HighQuality);

(Mặc định là BitmapScalingMode.Lineartương đương với BitmapScalingMode.LowQuality.)


3

Tôi sử dụng ImageProcessorCore, chủ yếu là vì nó hoạt động .Net Core.

Và nó có nhiều tùy chọn hơn như chuyển đổi các loại, cắt xén hình ảnh và hơn thế nữa

http://image Processor.org/image Processor /


1
Tôi đã xem và điều này không hỗ trợ .NET Core. Nó được xây dựng dựa trên khuôn khổ đầy đủ.
chrisdrobison

1

Thay đổi kích thước và lưu hình ảnh để vừa với chiều rộng và chiều cao như khung vẽ giữ tỷ lệ hình ảnh

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;

namespace Infra.Files
{
    public static class GenerateThumb
    {
        /// <summary>
        /// Resize and save an image to fit under width and height like a canvas keeping things proportional
        /// </summary>
        /// <param name="originalImagePath"></param>
        /// <param name="thumbImagePath"></param>
        /// <param name="newWidth"></param>
        /// <param name="newHeight"></param>
        public static void GenerateThumbImage(string originalImagePath, string thumbImagePath, int newWidth, int newHeight)
        {
            Bitmap srcBmp = new Bitmap(originalImagePath);
            float ratio = 1;
            float minSize = Math.Min(newHeight, newHeight);

            if (srcBmp.Width > srcBmp.Height)
            {
                ratio = minSize / (float)srcBmp.Width;
            }
            else
            {
                ratio = minSize / (float)srcBmp.Height;
            }

            SizeF newSize = new SizeF(srcBmp.Width * ratio, srcBmp.Height * ratio);
            Bitmap target = new Bitmap((int)newSize.Width, (int)newSize.Height);

            using (Graphics graphics = Graphics.FromImage(target))
            {
                graphics.CompositingQuality = CompositingQuality.HighSpeed;
                graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
                graphics.CompositingMode = CompositingMode.SourceCopy;
                graphics.DrawImage(srcBmp, 0, 0, newSize.Width, newSize.Height);

                using (MemoryStream memoryStream = new MemoryStream())
                {
                    target.Save(thumbImagePath);
                }
            }
        }
    }
}

1

Sử dụng chức năng dưới đây với ví dụ dưới đây để thay đổi kích thước hình ảnh:

//Example : 
System.Net.Mime.MediaTypeNames.Image newImage = System.Net.Mime.MediaTypeNames.Image.FromFile("SampImag.jpg");
System.Net.Mime.MediaTypeNames.Image temImag = FormatImage(newImage, 100, 100);

//image size modification unction   
public static System.Net.Mime.MediaTypeNames.Image FormatImage(System.Net.Mime.MediaTypeNames.Image img, int outputWidth, int outputHeight)
{

    Bitmap outputImage = null;
    Graphics graphics = null;
    try
    {
         outputImage = new Bitmap(outputWidth, outputHeight, System.Drawing.Imaging.PixelFormat.Format16bppRgb555);
         graphics = Graphics.FromImage(outputImage);
         graphics.DrawImage(img, new Rectangle(0, 0, outputWidth, outputHeight),
         new Rectangle(0, 0, img.Width, img.Height), GraphicsUnit.Pixel);

         return outputImage;
     }
     catch (Exception ex)
     {
           return img;
     }
}

2
Vui lòng xem xét để giải thích trong câu trả lời của bạn ở trên về cách sử dụng mã này, mã này làm gì và cách giải quyết vấn đề trong câu hỏi ban đầu.
Tim Visée

Tôi đã thêm trường hợp sử dụng cũng. Sử dụng chức năng trên với ví dụ dưới đây. Hình ảnh newImage = Image.FromFile ("SampImag.jpg"); Hình ảnh temImag = FormatImage (newImage, 100, 100);
Prasad KM


0

Lưu ý: điều này sẽ không hoạt động với ASP.Net Core vì WebImage phụ thuộc vào System.Web, nhưng trên các phiên bản trước của ASP.Net tôi đã sử dụng đoạn mã này nhiều lần và rất hữu ích.

String ThumbfullPath = Path.GetFileNameWithoutExtension(file.FileName) + "80x80.jpg";
var ThumbfullPath2 = Path.Combine(ThumbfullPath, fileThumb);
using (MemoryStream stream = new MemoryStream(System.IO.File.ReadAllBytes(fullPath)))
{
      var thumbnail = new WebImage(stream).Resize(80, 80);
      thumbnail.Save(ThumbfullPath2, "jpg");
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.