使用位图内切椭圆剪裁位图的最佳方法是什么

本文关键字:位图 最佳 方法 剪裁 是什么 | 更新日期: 2023-09-27 18:33:07

我想拍摄一个具有 ARGB 32 像素格式的位图并对其进行裁剪,以便保留其内切椭圆内的内容,椭圆外的任何内容都变成 ARGB(0,0,0,0)。我可以使用 GetPixel 和 SetPixel 以及一些三角函数以编程方式做到这一点,以确定哪个像素越界 - 但我怀疑有一种更好、更内置的方法可以做到这一点。

有什么想法吗?

使用位图内切椭圆剪裁位图的最佳方法是什么

感谢亚历山德罗·德安德里亚指出区域部分 - 我已经弄清楚了其余的:

    public Bitmap Rasterize()
    {
        Bitmap ringBmp = new Bitmap(width: _size.Width, height: _size.Height, format: PixelFormat.Format32bppArgb);
        //Create an appropriate region from the inscribed ellipse
        Drawing2D.GraphicsPath graphicsEllipsePath = new Drawing2D.GraphicsPath();
        graphicsEllipsePath.AddEllipse(0, 0, _size.Width, _size.Height);
        Region ellipseRegion = new Region(graphicsEllipsePath);
        //Create a graphics object from our new bitmap
        Graphics gfx = Graphics.FromImage(ringBmp);
        //Draw a resized version of our image to our new bitmap while using the highest quality interpolation and within the defined ellipse region
        gfx.InterpolationMode = Drawing2D.InterpolationMode.NearestNeighbor;
        gfx.SmoothingMode = Drawing2D.SmoothingMode.HighQuality;
        gfx.PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality;
        gfx.PageUnit = GraphicsUnit.Pixel;
        gfx.Clear(Color.Transparent);
        gfx.Clip = ellipseRegion;
        gfx.DrawImage(image: _image, rect: new Rectangle(0, 0, _size.Width, _size.Height));
        //Dispose our graphics
        gfx.Dispose();
        //return the resultant bitmap
        return ringBmp;
    }

显然,将 PixelOffsetMode 设置为 High Quality 非常重要,因为否则 DrawImage 方法会裁剪结果图像的一部分。