Search code examples
polygonblureffectimagesharp

Apply GaussianBlur or Pixelate to Polygon


i was able to apply GaussianBlur or Pixelate on rectangle areas.

image.Mutate(x => x.GaussianBlur(5, new CoreRectangle(o.BoundingBox.X - 10, o.BoundingBox.Y - 10, o.BoundingBox.Width + 20, o.BoundingBox.Height + 20)));

Is there a way to use a n-point polygon instead? Any ideas?

Thank you! Jörg


Solution

  • This should work for you, it clones the original image, applies effects to the clone and then using an image bush fills a shape with exactly the right portion of the mutated image.

    
    using (Image image = Image.Load("fb.jpg"))
    {
        var outerRadii = Math.Min(image.Width, image.Height) / 2;
        var star = new Star(new PointF(image.Width / 2, image.Height / 2), 5, outerRadii / 2, outerRadii);
    
        // we want to clone our source image so we can apply 
        // various effects to it without mutating the original.
        using (var clone = image.Clone(p => {
            p.GaussianBlur(15); // apply the effect here you and inside the shape
        }))
        {
            // crop the cloned down to just the size of the shape (this is due to the way ImageBrush works)
            clone.Mutate(x => x.Crop((Rectangle)star.Bounds));
    
            // use an image brush to apply the section of cloned image as the source for filling the shape
            var brush = new ImageBrush(clone);
    
            // now fill the shape with the image brush containing the portion of 
            // cloned image with the effects applied
            image.Mutate(c => c.Fill(brush, star));
        }
    
        image.Save("output/fb.png");
    }
    

    This is an example of the final result:

    Resultant of blurred star

    This is and other samples are available in the ImageSharp samples repository https://github.com/SixLabors/Samples