이미지 C #의 크기를 조정하는 방법


288

Size, Width그리고 Height있습니다Get() 의 특성 System.Drawing.Image;
C #에서 런타임에 Image 객체의 크기를 어떻게 조정할 수 있습니까?

지금은 Image다음을 사용하여 새로운 것을 만들고 있습니다 .

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

2
올바른 방법이 아닙니다 ... 품질이 낮은 보간법을 사용하여 새 비트 맵 이미지가 지속되는 동안 원본 스트림이 잠긴 상태로 유지 될 수 있습니다 ... 이미지 크기 조정 함정 목록을 읽고 자신의 이미지 크기 조정 솔루션을 수행하십시오.
Lilith River

2
그것을 처분하십시오! Using () {} 작동합니다!
Scott Coates

8
이 답변이 도움이된다면 허용되는 답변을 표시하십시오.
Joel

3
추가 라이브러리를 사용할 필요가 없습니다. Mark가 아래에 게시 한 코드는 완벽하게 작동합니다.
Elmue

9
마크는 누구입니까? 나는 그의 대답을 찾지 못했지만 그것을 언급하는 3 가지 의견이 있습니다.
Sinatr

답변:


490

고품질 크기 조정이 수행됩니다.

/// <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) 이미지 테두리 주위의 고 스팅을 방지합니다. 순진한 크기 조정은 이미지 경계를 넘어 투명한 픽셀을 샘플링하지만 이미지를 미러링하여 더 나은 샘플을 얻을 수 있습니다 (이 설정은 매우 눈에)니다).
  • destImage.SetResolution 물리적 크기와 상관없이 DPI 유지-이미지 크기를 줄이거 나 인쇄 할 때 품질이 향상 될 수 있음
  • 합성은 픽셀이 배경과 혼합되는 방식을 제어합니다. 한 가지만 그리기 때문에 필요하지 않을 수도 있습니다.
    • graphics.CompositingMode소스 이미지의 픽셀을 덮어 쓰는지 또는 배경 픽셀과 결합 할지를 결정합니다. SourceCopy색상이 렌더링 될 때 배경색을 덮어 쓰도록 지정합니다.
    • graphics.CompositingQuality 레이어 이미지의 렌더링 품질 수준을 결정합니다.
  • graphics.InterpolationMode 두 끝점 사이의 중간 값을 계산하는 방법을 결정합니다.
  • graphics.SmoothingMode 채워진 영역의 선, 곡선 및 가장자리가 스무딩 (앤티 앨리어싱이라고도 함)을 사용하는지 여부를 지정합니다. 아마도 벡터에서만 작동합니다.
  • graphics.PixelOffsetMode 새 이미지를 그릴 때 렌더링 품질에 영향을줍니다

가로 세로 비율을 유지하는 것은 독자의 연습으로 남아 있습니다 (실제로, 나는이 기능이 당신을 위해 그것을하는 것이 아니라고 생각합니다).

또한 이미지 크기 조정의 함정 중 일부를 설명 하는 좋은 기사 입니다. 위의 기능은 대부분을 다루지 만 여전히 저장 에 대해 걱정해야합니다 .


4
코드는 이미지 크기를 조정할 때 완벽하게 작동했지만 크기는 66KB에서 132KB로 증가했습니다. 내가 그것을 줄일 수
있습니까

3
@chamara 아마 당신이 선택한 품질을 저장하기 때문일 것입니다. msdn.microsoft.com/en-us/library/bb882583(v=vs.110).aspx 참조 quality = 90
mpen

3
@kstubs 확실합니다. Bitmap기본적으로 클래스의 이름 일 뿐이므로 원하는 파일 형식으로 저장할 수 있습니다.
mpen

5
@dotNetBlackBelt 아마도 참조를 System.Drawing추가하고 추가해야합니다using System.Drawing.Imaging;
mpen

2
이것은 원래 종횡비를 올바르게 유지하지 않습니까?
Kasper Skov

148

이것에 대해 너무 어려운 것이 무엇인지, 당신이하고있는 일을하고, 오버로드 된 비트 맵 생성자를 사용하여 크기가 조정 된 이미지를 만드십시오.

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

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

2
yourImage새 이미지에 할당하기 전에 폐기해서는 안 됩니까?
Nick Shaw

3
수동으로 처리하거나 가비지 수집기가 작동하도록 할 수 있습니다. 문제 없어.
Elmue

23
이 코드는 크기 조정의 품질을 제어하지 않으므로 매우 중요합니다. Mark의 답변을 살펴보십시오.
Elmue

43

에서 이 질문 , 당신은 내 등 일부 답변을해야합니다 :

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
imgPhoto.Dispose ()를 잊어 버렸습니다. 파일은 계속 사용됩니다
shrutyzet

1
이것은 매우 유용하며 내 앱에서 이것을 사용하고 있습니다. 그러나이 알고리즘은 투명한 이미지에서는 작동하지 않습니다. 모든 투명한 픽셀을 검은 색으로 바꿉니다. 수정하기 쉽지만 사용자를위한 참고 사항입니다. :)
meme

1
이미지를 저장하지 않겠습니까? imgPhoto.Save ()?
Whiplash

@meme 투명한 문서를 위해 검정색 배경을 수정하는 방법에 대한 링크를 제공 할 수 있습니까?
Syed Mohamed

25

왜이 System.Drawing.Image.GetThumbnailImage방법을 사용하지 않습니까?

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

예:

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

출처 : http://msdn.microsoft.com/en-us/library/system.drawing.image.getthumbnailimage.aspx


6
이미지 크기를 조정하는 올바른 방법이 아닙니다. jpg에서 썸네일이 있으면이를 가져옵니다. 존재하지 않으면 품질이나 새 이미지를 제어 할 수 없습니다. 또한이 코드는 메모리 누수가 있습니다.
Robert Smith

1
@Bobrot 왜 메모리 누수가 발생합니까?
사용자

2
GDI 라이브러리의 모든 항목은 여전히 ​​관리되지 않는 상태로 실행됩니다. 나중에 using 문을 사용하거나 객체를 폐기하지 않으면 시스템에서 해당 객체를 가비지 수집하고 메모리를 다시 사용할 수있게하는 데 시간이 오래 걸릴 수 있습니다.
Robert Smith

9
그것은 당신이 말하는대로 : 시간이 오래 걸릴 수 있습니다. 그러나 이것은 메모리 누수가 아닙니다. 메모리가 해제되지 않으면 메모리 누출이 발생합니다. 그러나 이것은 CPU가 유휴 상태 일 때 메모리를 해제하는 가비지 수집기의 정상적인 동작입니다. using () 문은 메모리 누수를 방지하지 않습니다. 가비지 수집기에서 메모리를 해제 할 시간이 있으면 메모리를 즉시 해제합니다. 이것이이 특정한 경우의 유일한 차이점입니다.
Elmue

이미지 크기 조정의 함정 참조 : nathanaeljones.com/blog/2009/20-image-resizing-pitfalls "GetThumbnailImage () 사용. GetThumbnailImage ()는 명백한 선택 인 것으로 보이며 많은 기사에서 사용을 권장합니다. 불행히도 항상 내장 된 jpeg를 가져옵니다. GetThumbnailImage가 일부 사진에서 잘 작동하는 이유가 궁금하지만 다른 사진이 몹시 흐릿한 경우 궁금 할 것입니다. 그런 이유로 10x10x10보다 큽니다. "
Nick Painter

12

libvips 의 C # 바인딩 인 net-vips를 시도 할 수 있습니다. 지연되고 스트리밍되는 수요 중심 이미지 처리 라이브러리이므로 전체 이미지를로드하지 않고도 이와 같은 작업을 수행 할 수 있습니다.

예를 들어, 편리한 이미지 썸네일 러가 제공됩니다.

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

또한 이미지의 가장 중요한 부분을 지능적으로 결정하고 이미지를 자르는 동안 초점을 유지하는 방법 인 스마트 자르기를 지원합니다. 예를 들면 다음과 같습니다.

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

owl.jpg오프 센터 구성은 어디에 있습니까?

올빼미

이 결과를 제공합니다.

올빼미 스마트 자르기

먼저 이미지를 축소하여 세로 축을 128 픽셀로 만든 다음 attention전략 을 사용하여 128 픽셀로 자릅니다 . 이 이미지는 사람의 눈을 사로 잡을 수있는 기능을 이미지에서 검색합니다 ( Smartcrop()자세한 내용 은 참조).


libvips에 대한 귀하의 바인딩은 훌륭해 보입니다. 나는 당신의 라이브러리를 확실히 살펴볼 것입니다. 이것을 C # Developer에서 사용할 수있게 해주셔서 감사합니다!
FrenchTastic

이것은 최고입니다! 이미지 처리 라이브러리가이 모습을 잘 알지 못했습니다.
dalvir

좋은! ImageMagick 중량보다 우수
Moshe L

10

이것은 것입니다-

  • 루프가 없어도 너비와 높이 크기 조정
  • 이미지의 원래 크기를 초과하지 않습니다

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

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는 'Width'및 'Height'속성을 설정할 수 없으므로 코드가 작동하지 않는 System.Drawing.Image에 대해 질문했습니다. 그러나 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;
}

그래픽을 폐기하는 것을 잊었습니다. 보간 모드가 개선 된 새로운 비트 맵 (이미지, 너비, 높이) 과 동일한 원리로 보입니다 . 나는 Default 가 무엇인지 궁금합니다 . 보다 더 나쁜가 Low?
Sinatr

9

이 코드는 위의 답변 중 하나에서 게시 된 것과 동일하지만 투명 픽셀을 검정 대신 흰색으로 변환합니다 ... 감사합니다 :)

    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

응용 프로그램에서 여러 옵션으로 함수를 만들어야했습니다. 크기는 크지 만 이미지 크기를 조정하고 종횡비를 유지하며 가장자리를 잘라 이미지의 중심 만 반환 할 수 있습니다.

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

함수에보다 쉽게 ​​액세스 할 수 있도록 오버로드 된 함수를 추가 할 수 있습니다.

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

이제 설정해야 할 마지막 두 부울 옵션이 있습니다. 다음과 같이 함수를 호출하십시오.

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

여기를 클릭하십시오 http://bhupendrasinghsaini.blogspot.in/2014/07/resize-image-in-c.html


6

이것은 특정 요구 사항, 즉 목적지가 항상 가로 비율입니다. 그것은 당신에게 좋은 시작을 제공해야합니다.

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;

}

대박!!! 나는 인물 이미지에 문제가 있었고 웹에서 많은 솔루션을 찾으려고 노력한 후에는 이것이 유일한 것이 었습니다! 정말 고맙습니다!
파티오

3

당신이 작업하는 경우 BitmapSource:

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

품질을보다 세밀하게 제어하려면 먼저 다음을 실행하십시오.

RenderOptions.SetBitmapScalingMode(
    bitmapSource,
    BitmapScalingMode.HighQuality);

(기본값은 BitmapScalingMode.Linear입니다 BitmapScalingMode.LowQuality.)


3

ImageProcessorCore를 사용합니다. 주로 .Net Core에서 작동하기 때문입니다.

그리고 유형 변환, 이미지 자르기 등과 같은 더 많은 옵션이 있습니다.

http://imageprocessor.org/imageprocessor/


1
나는 보았고 이것은 .NET Core를 지원하지 않습니다. 전체 프레임 워크를 기반으로 구축되었습니다.
chrisdrobison

1

이미지를 비례 적으로 유지하는 캔버스와 같이 너비와 높이에 맞게 이미지 크기 조정 및 저장

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

이미지 크기를 변경하려면 아래 예제와 함께 아래 기능을 사용하십시오.

//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
위의 답변 에서이 코드를 사용하는 방법, 코드의 기능 및 원래 질문의 문제를 해결하는 방법을 설명하십시오.
Tim Visée

유스 케이스도 추가했습니다. 아래 예제와 함께 위의 기능을 사용하십시오. Image newImage = Image.FromFile ( "SampImag.jpg"); 이미지 temImag = FormatImage (newImage, 100, 100);
Prasad KM


0

참고 : WebImage는 System.Web에 의존하기 때문에 ASP.Net Core에서는 작동하지 않지만 이전 버전의 ASP.Net에서는이 스 니펫을 여러 번 사용하여 유용했습니다.

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");
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.