래스터 및 벡터 이미지 그리기

웹사이트, 데스크톱 애플리케이션, 모바일 앱 등 무엇을 구축하든 이미지를 처리하고 편집할 때 이미지를 조작하고 그리는 능력은 중요한 측면입니다. 개발자에게 구현하기 쉬운 고급 그리기 기능을 제공하기 위해 C# .NET 애플리케이션용으로 설계된 강력한 API인 Aspose.Imaging.드로잉을 도입하여 다양한 이미지 그리기 기능을 제공합니다.

C# .NET 드로잉 라이브러리

Aspose.Imaging.드로잉은 고급 이미지 처리 기술을 사용하여 래스터 및 벡터 이미지를 처리할 수 있는 강력한 API입니다. API는 기본 바이트 액세스를 통해 이미지를 생성하거나 조작하는 동안 높은 처리 속도를 보장합니다. API를 사용하면 픽셀 조작 및 그래픽 경로를 사용하여 개체를 그릴 수 있고 이미지를 한 형식에서 다른 형식으로 변환할 수 있습니다. Aspose.Imaging.드로잉은 외부 종속성 없이 텍스트, 형상 및 이미지를 그리기 위한 완전한 기능 세트를 제공하는 크로스 플랫폼 2D 그래픽 라이브러리인 Aspose.드로잉을 기본 그래픽 엔진으로 사용합니다.

NuGet에서 Aspose.Imaging.드로잉을 다운로드하여 설치할 수 있습니다.

PM> NuGet\Install-Package Aspose.Imaging.Drawing

이제 이 .NET Drawing API의 몇 가지 주요 기능과 소스 코드를 통한 사용법을 살펴보겠습니다.

.NET 드로잉 라이브러리를 사용하여 그래픽 생성

Aspose.Imaging.드로잉을 사용하면 원, 선, 삼각형, 사각형, 타원과 같은 다양한 개체를 그려서 이미지를 만들 수 있습니다. 래스터 이미지뿐만 아니라 API를 사용하여 벡터 이미지를 생성할 수도 있습니다. 이 .NET 드로잉 API를 사용하여 C#에서 래스터 및 벡터 이미지를 그리는 방법을 살펴보겠습니다.

래스터 이미지 그리기

Aspose.Imaging.드로잉 API를 사용하여 래스터 이미지를 그리는 단계는 다음과 같습니다.

  • 먼저 Image.Create() 메서드를 사용하여 원하는 형식의 이미지를 만듭니다.
  • 그런 다음 Graphics 클래스의 객체를 생성하고 위에서 생성한 Image로 초기화합니다.
  • Graphics.Clear 메서드를 사용하여 이미지 표면을 지웁니다.
  • 새로운 펜을 생성하고 원하는 색상으로 초기화하세요.
  • Graphics.DrawEllipse() 메서드를 사용하여 타원(또는 기타 그래픽 객체)을 그립니다.
  • Graphics.FillPolygon() 메서드를 사용하여 다각형을 그립니다.
  • 마지막으로 Image.Save() 메서드를 사용하여 이미지를 저장합니다.

다음 코드 조각은 C#에서 이미지를 그리는 방법을 보여줍니다.

string outputFolder = @"Output\";

// BmpOptions 인스턴스를 생성하고 다양한 속성을 설정합니다.
BmpOptions imageOptions = new BmpOptions();
imageOptions.BitsPerPixel = 24;

// FileCreateSource의 인스턴스를 생성하고 이를 Source 속성에 할당합니다. 
imageOptions.Source = new FileCreateSource(outputFolder + "result.bmp", false);

using (var image = Image.Create(imageOptions, 500, 500))
{
    var graphics = new Graphics(image);

    // 흰색으로 이미지 표면을 지우고 파란색으로 Pen 객체를 생성 및 초기화합니다.
    graphics.Clear(Color.White);
    var pen = new Pen(Color.Blue);

    // 너비가 150이고 높이가 100인 경계 사각형을 정의하여 타원을 그립니다. 또한 LinearGradientBrush를 사용하여 다각형을 그립니다.
    graphics.DrawEllipse(pen, new Rectangle(10, 10, 150, 100));

    using (var linearGradientBrush = new LinearGradientBrush(image.Bounds, Color.Red, Color.White, 45f))
    {
        graphics.FillPolygon(linearGradientBrush, new[] { new Point(200, 200), new Point(400, 200), new Point(250, 350) });
    }

    // 이미지를 저장
    image.Save();
}

벡터 이미지 그리기

래스터 이미지와 마찬가지로 몇 가지 간단한 단계를 거쳐 SVG와 같은 벡터 그래픽을 그릴 수 있습니다. C# 드로잉 라이브러리를 사용하여 벡터 이미지를 만들어 보겠습니다.

  • 먼저 MemoryStream 개체를 만듭니다.
  • 그런 다음 SVG 이미지를 로드합니다.
  • SVG를 PNG로 래스터화하고 결과를 스트림에 씁니다.
  • 추가 그리기를 위해 스트림에서 PNG 이미지를 로드합니다.
  • 기존 SVG 이미지에 PNG 이미지를 그립니다.
  • 마지막으로 결과를 저장합니다.

다음 코드 조각은 C#에서 벡터 이미지를 그리는 방법을 보여줍니다.

string templatesFolder = @"Templates\";
string outputFolder = @"Output\";

using (MemoryStream drawnImageStream = new MemoryStream())
{
    // 먼저 Svg를 Png로 래스터화하고 결과를 스트림에 씁니다.
    using (SvgImage svgImage = (SvgImage)Image.Load(templatesFolder + "template.svg"))
    {
        SvgRasterizationOptions rasterizationOptions = new SvgRasterizationOptions();
        rasterizationOptions.PageSize = svgImage.Size;

        PngOptions saveOptions = new PngOptions();
        saveOptions.VectorRasterizationOptions = rasterizationOptions;

        svgImage.Save(drawnImageStream, saveOptions);

        // 이제 추가 그리기를 위해 스트림에서 Png 이미지를 로드합니다.
        drawnImageStream.Seek(0, System.IO.SeekOrigin.Begin);
        using (RasterImage imageToDraw = (RasterImage)Image.Load(drawnImageStream))
        {
            // 기존 SVG 이미지에 그림을 그립니다.
            Aspose.Imaging.FileFormats.Svg.Graphics.SvgGraphics2D graphics = new Aspose.Imaging.FileFormats.Svg.Graphics.SvgGraphics2D(svgImage);

            // 그려진 이미지 전체를 2배 축소하여 작화면 중앙에 그립니다.
            int width = imageToDraw.Width / 2;
            int height = imageToDraw.Height / 2;
            Point origin = new Point((svgImage.Width - width) / 2, (svgImage.Height - height) / 2);
            Size size = new Size(width, height);

            graphics.DrawImage(imageToDraw, origin, size);

            // 결과 이미지 저장
            using (SvgImage resultImage = graphics.EndRecording())
            {
                resultImage.Save(outputFolder + "vector_image.svg");
            }
        }
    }
}

이미지에 마스킹 적용

이미지 편집에서 마스킹이란 이미지의 특정 부분을 선택적으로 숨기거나 드러내는 기술을 말합니다. 여기에는 원본 이미지의 각 픽셀의 투명도 또는 불투명도를 정의하는 기본적으로 회색조 이미지인 마스크를 만드는 작업이 포함됩니다. 이미지 마스킹은 인식 및 진단을 위해 널리 사용됩니다.

Aspose.Image.드로잉은 이미지 마스킹을 적용하는 두 가지 방법을 제공합니다.

  • 수동 마스킹 - ROI 세트를 마스크로 사용합니다. 각 슬라이스의 ROI는 마스크를 정의하는 데 사용됩니다. 추가 사용자 입력이 필요합니다.
  • 자동 마스킹 - 사용자의 입력 데이터가 많이 필요하지 않지만 정확하지 않을 수 있습니다.

이제 C# 코드에서 이미지에 수동 및 자동 마스킹을 적용하는 방법을 살펴보겠습니다.

수동 이미지 마스킹

다음 코드 조각은 C#에서 이미지에 수동 마스킹을 적용하는 방법을 보여줍니다.

string outputFolder = @"Output\";

// 소스 파일
string sourceFileName = outputFolder + "couple.png";

// 그래픽 경로 생성
GraphicsPath manualMask = new GraphicsPath();

// 도형 추가
Figure firstFigure = new Figure();
firstFigure.AddShape(new EllipseShape(new RectangleF(100, 30, 40, 40)));
firstFigure.AddShape(new RectangleShape(new RectangleF(10, 200, 50, 30)));

// 그림 추가
manualMask.AddFigure(firstFigure);

GraphicsPath subPath = new GraphicsPath();
Figure secondFigure = new Figure();
secondFigure.AddShape(
    new PolygonShape(
     new PointF[]
     {
        new PointF(310, 100), new PointF(350, 200), new PointF(250, 200)

     }, true));

secondFigure.AddShape(new PieShape(new RectangleF(10, 10, 80, 80), 30, 120));
subPath.AddFigure(secondFigure);
manualMask.AddPath(subPath);

// 마스킹 적용
using (RasterImage image = (RasterImage)Image.Load(sourceFileName))
{
    MaskingOptions maskingOptions = new MaskingOptions()
    {
        Method = SegmentationMethod.Manual,
        Args = new ManualMaskingArgs
        {
            Mask = manualMask
        },
        Decompose = false,
        ExportOptions =
      new PngOptions()
      {
          ColorType = PngColorType.TruecolorWithAlpha,
          Source = new StreamSource(new MemoryStream())
      },
    };
    MaskingResult results = new ImageMasking(image).Decompose(maskingOptions);
    // 최종 마스킹 결과를 저장합니다.
    using (RasterImage resultImage = (RasterImage)results[1].GetImage())
    {
        resultImage.Save(outputFolder + "manual_masking.png", new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
    }
}

자동 이미지 마스킹

아래 코드 조각은 .NET 그리기 API를 사용하여 이미지에 자동 마스킹을 적용합니다.

string outputFolder = @"Output\";

MaskingResult results;
using (RasterImage image = (RasterImage)Image.Load(outputFolder + "couple.jpg"))
{
    // 자동 계산된 스트로크와 함께 그래프 잘라내기를 사용하려면 AutoMaskingGraphCutOptions가 사용됩니다.
    AutoMaskingGraphCutOptions options = new AutoMaskingGraphCutOptions
    {
        // 이미지 분해 중에 기본 스트로크의 새로운 계산이 수행되어야 함을 나타냅니다.
        CalculateDefaultStrokes = true,
        
        // 이미지 크기에 따라 사후 처리 페더링 반경을 설정합니다.
        FeatheringRadius = (Math.Max(image.Width, image.Height) / 500) + 1,
        Method = SegmentationMethod.GraphCut,
        Decompose = false,
        ExportOptions =
            new PngOptions()
            {
                ColorType = PngColorType.TruecolorWithAlpha,
                Source = new FileCreateSource(outputFolder + "auto_masking.png")
            },
        BackgroundReplacementColor = Color.Transparent
    };

    results = new ImageMasking(image).Decompose(options);

    using (RasterImage resultImage = (RasterImage)results[1].GetImage())
    {
        resultImage.Save(outputFolder + "auto_masking_2.png", new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
    }
}

이미지에 필터 적용

이미지에 필터를 적용하는 것은 다양한 목적으로 사용되며 사람들은 실용적이고 예술적인 다양한 이유로 필터를 사용합니다. 이미지 필터의 가장 일반적인 용도로는 색상 보정, 이미지 품질 향상, 특수 효과 적용, 노이즈 감소 등이 있습니다. Aspose.Imaging.드로잉은 중앙값, 모션 웨이너, 가우스 웨이너 등과 같이 이미지에 적용할 수 있는 여러 유형의 필터를 지원합니다.

데모를 위해 Aspose.Imaging.드로잉을 사용하여 이미지에 중앙값 필터를 적용하는 다음 코드를 살펴보세요.

string templatesFolder = @"Templates\";
string outputFolder = @"Output\";

// 시끄러운 이미지 로드 
using (Image image = Image.Load(templatesFolder + "template.gif"))
{
    // 이미지를 RasterImage로 캐스팅
    RasterImage rasterImage = image as RasterImage;
    if (rasterImage == null)
    {
        return;
    }

    // MedianFilterOptions 클래스의 인스턴스를 생성하고 크기를 설정한 후 RasterImage 객체에 MedianFilterOptions 필터를 적용하고 결과 이미지를 저장합니다.
    MedianFilterOptions options = new MedianFilterOptions(4);
    rasterImage.Filter(image.Bounds, options);

    // 이미지를 저장
    image.Save(outputFolder + "median_filter.gif");
}

이미지 자르기, 회전 및 크기 조정

이미지 자르기, 회전 및 크기 조정은 이미지 편집 애플리케이션의 필수 기능으로 간주됩니다. 이는 디지털 이미지를 조작하는 데 사용되는 가장 일반적인 이미지 처리 작업입니다. Aspose.Imaging.드로잉 API를 사용하여 이미지를 자르고, 회전하고, 크기를 조정하는 방법을 살펴보겠습니다.

이미지 자르기

이미지를 자르려면 이미지의 네 측면 모두에 대한 이동 값을 제공해야 합니다. 이러한 값을 기반으로 이미지 경계가 이미지 중심을 향해 이동됩니다. 다음 C# 코드 조각은 제공된 이동 값을 기반으로 이미지를 자릅니다.

string templatesFolder = @"Templates\";
string outputFolder = @"Output\";

// RasterImage 클래스의 인스턴스에 기존 이미지 로드
using (RasterImage rasterImage = (RasterImage)Image.Load(templatesFolder + "template.jpg"))
{
    // 더 나은 성능을 위해 자르기 전에 이미지를 캐시해야 합니다.
    if (!rasterImage.IsCached)
    {
        rasterImage.CacheData();
    }

    // 네 측면 모두에 대한 이동 값을 정의합니다.
    int leftShift = 10;
    int rightShift = 10;
    int topShift = 10;
    int bottomShift = 10;

    // 이동 값을 기반으로 이미지에 자르기를 적용합니다. 자르기 방법은 이미지 경계를 이미지 중심으로 이동하고 결과를 디스크에 저장합니다.
    rasterImage.Crop(leftShift, rightShift, topShift, bottomShift);

    // 자른 이미지 저장
    rasterImage.Save(outputFolder + "cropped_image.jpg");
}

이미지 회전

이미지를 회전하기 위해 Aspose.Imaging.드로잉은 이미지를 회전할 뿐만 아니라 (필요한 경우) 뒤집을 수도 있는 RotateFlip 메서드를 제공합니다. RotateFlipType 열거형에서 원하는 회전 및 뒤집기 옵션을 선택할 수 있습니다. 다음 코드 조각은 C#에서 이미지를 회전하지만 뒤집지는 않는 방법을 보여줍니다.

string templatesFolder = @"Templates\";
string outputFolder = @"Output\";

// 이미지 로드 및 회전
using (var image = Image.Load(templatesFolder + "template.jpg"))
{
    // 이미지 회전
    image.RotateFlip(RotateFlipType.Rotate270FlipNone);

    // 이미지를 저장
    image.Save(outputFolder + "rotated_image.jpg");
}

이미지 크기 조정

Aspose.Imaging.드로잉을 사용하여 이미지 크기를 조정하는 것은 파이처럼 간단합니다. Resize 메서드를 호출하고 새 높이 및 너비 값을 전달하면 됩니다. 다음 코드 조각은 C#에서 이미지 크기를 조정하는 방법을 보여줍니다.

string templatesFolder = @"Templates\";
string outputFolder = @"Output\";

using (Image image = Image.Load(templatesFolder + "template.jpg"))
{
    // 이미지 크기 조정
    image.Resize(300, 300);

    // 이미지를 저장
    image.Save(outputFolder + "resized_image.jpg");
}   

이미지를 다른 형식으로 변환

Aspose.Imaging. Drawing API를 사용하여 이미지를 변환하려면 이미지를 로드하고 원하는 출력 형식으로 저장하기만 하면 됩니다. 다음 코드 조각은 JPG 이미지를 WebP, PSD, PDF 및 TIFF 형식으로 변환합니다.

string templatesFolder = @"Templates\";
string outputFolder = @"Output\";

using (var img = Aspose.Imaging.Image.Load(templatesFolder + "template.jpg"))
{
    // 다양한 이미지 형식으로 저장
    img.Save(outputFolder + "output.webp", new Aspose.Imaging.ImageOptions.WebPOptions());
    img.Save(outputFolder + "output.psd ", new Aspose.Imaging.ImageOptions.PsdOptions());
    img.Save(outputFolder + "output.tiff", new Aspose.Imaging.ImageOptions.TiffOptions(TiffExpectedFormat.Default));

    // PDF로 저장
    PdfOptions exportOptions = new PdfOptions();
    exportOptions.PdfDocumentInfo = new Aspose.Imaging.FileFormats.Pdf.PdfDocumentInfo();
    img.Save(outputFolder + "output.pdf", exportOptions);
}

무료 API 라이선스 받기

Aspose.Imaging.드로잉 API를 평가하고 싶다면 무료 임시 라이선스를 받으세요. 이를 통해 API를 아무런 제한 없이 최대 용량으로 사용할 수 있습니다.

결론

그래픽 및 이미지 처리 영역에서 Aspose.Imaging.드로잉 API는 C# .NET 개발자를 위한 다양하고 강력한 도구로 돋보입니다. 시각적 요소를 향상시키거나, 이미지 왜곡을 수정하거나, 형식 간에 이미지를 변환하려는 경우 이 API는 포괄적인 기능 세트를 제공합니다. Aspose.Imaging.드로잉을 사용하면 이미지 조작이 손쉽게 이루어지므로 프로그래밍 방식으로 매력적이고 시각적으로 놀라운 그래픽을 만들 수 있습니다.

피드백이나 문의 사항이 있으면 포럼을 통해 알려주세요.