2

I'm using the following code to produce a vignette effect on an image. As you can see below it works quite well. I'd like to be able to adjust the inner spread of the vignette (i.e make the middle brighter and shorten the gradient) however the maths have got the better of me. Could anyone please give me some pointers with an explanation?

    protected override void Apply(ImageBase target, 
        ImageBase source, 
        Rectangle targetRectangle, 
        Rectangle sourceRectangle, 
        int startY, int endY)
    {
        int startX = sourceRectangle.X;
        int endX = sourceRectangle.Right;
        Color color = this.Color;
        Vector2 centre = Rectangle.Center(targetRectangle);
        float rX = this.RadiusX > 0 ? this.RadiusX : targetRectangle.Width / 2f;
        float rY = this.RadiusY > 0 ? this.RadiusY : targetRectangle.Height / 2f;
        float maxDistance = (float)Math.Sqrt(rX * rX + rY * rY);

        Parallel.For(
            startY,
            endY,
            y =>
                {
                    for (int x = startX; x < endX; x++)
                    {
                        float distance = Vector2.Distance(centre, new Vector2(x, y));
                        Color sourceColor = target[x, y];
                        target[x, y] = Color.Lerp(sourceColor, 
                            color, .9f * distance / maxDistance);
                    }
                });
    }

Original Image Original image

Vignette Effect enter image description here

James South
  • 10,147
  • 4
  • 59
  • 115
  • How do you call it? It looks as if you just need to make the target rectangle smaller while keeping it in the middle.. – TaW Jan 08 '16 at 16:45

0 Answers0