繁体   English   中英

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

[英]What's the best way to clip a bitmap using its inscribed ellipse

我想获取一个ARGB 32像素格式的位图并对其进行裁剪,以便保留其内接椭圆内的内容,并且椭圆外的任何内容都将变为ARGB(0,0,0,0)。 我可以使用GetPixel和SetPixel以及一些三角函数以编程方式完成操作,以找出哪个像素超出范围-但我怀疑有更好的内置方法。

有任何想法吗?

感谢Alessandro D'Andria指出了区域部分-我已经弄清楚了其余部分:

    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设置为HighQuality非常重要,因为否则DrawImage方法将裁剪所得图像的一部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM