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

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

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

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



답변

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

/// <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 새 이미지를 그릴 때 렌더링 품질에 영향을줍니다

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

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


답변

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

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

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


답변

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

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


답변

왜이 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


답변

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()자세한 내용 은 참조).


답변

이것은 것입니다-

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

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

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


답변

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