Алгоритм эффекта виньетирования изображения with.NET
Я хотел бы знать, как я создаю эффект виньетирования на картинке с помощью C# и .Сеть.
есть ли у кого-нибудь идеи, как это сделать? Или есть какие-то ресурсы, которые уже сделали алгоритм для меня?
2 ответов
Я считаю, что это сделает то, что вы хотите:
public void PaintVignette(Graphics g, Rectangle bounds)
{
Rectangle ellipsebounds = bounds;
ellipsebounds.Offset(-ellipsebounds.X, -ellipsebounds.Y);
int x = ellipsebounds.Width - (int)Math.Round(.70712 * ellipsebounds.Width);
int y = ellipsebounds.Height - (int)Math.Round(.70712 * ellipsebounds.Height);
ellipsebounds.Inflate(x, y);
using (GraphicsPath path = new GraphicsPath())
{
path.AddEllipse(ellipsebounds);
using (PathGradientBrush brush = new PathGradientBrush(path))
{
brush.WrapMode = WrapMode.Tile;
brush.CenterColor = Color.FromArgb(0, 0, 0, 0);
brush.SurroundColors = new Color[] { Color.FromArgb(255, 0, 0, 0) };
Blend blend = new Blend();
blend.Positions = new float[] { 0.0f, 0.2f, 0.4f, 0.6f, 0.8f, 1.0F };
blend.Factors = new float[] { 0.0f, 0.5f, 1f, 1f, 1.0f, 1.0f };
brush.Blend = blend;
Region oldClip = g.Clip;
g.Clip = new Region(bounds);
g.FillRectangle(brush, ellipsebounds);
g.Clip = oldClip;
}
}
}
public Bitmap Vignette(Bitmap b)
{
Bitmap final = new Bitmap(b);
using (Graphics g = Graphics.FromImage(final)) {
PaintVignette(g, new Rectangle(0, 0, final.Width, final.Height));
return final;
}
}
что здесь происходит? Сначала я написал код, который заполнял прямоугольник эллиптической градиентной кистью, которая переходила от белого к черному. Затем я изменил код, чтобы заполненная область также включала углы. Я сделал это, увеличив размер прямоугольника на разницу между размерами прямоугольника и sqrt(2)/2 * размеры прямоугольника.
почему sqrt (2)/2? Потому что точка (sqrt (2) / 2, sqrt (2) / 2) - точка угла 45 градусов на единичном круге. Масштабирование по ширине и высоте дает расстояние, необходимое для раздувания прямой кишки, чтобы убедиться, что она полностью покрыта.
затем я отрегулировал смесь градиента, чтобы быть намного более белым в центре.
затем я изменил цвет с белого на чистый прозрачный черный и с черного на чистый непрозрачный черный. Это имеет влияние красить дальние углы черным и тень более менее на дороге внутри к центр.
наконец, я написал метод утилиты, который работает на растровом изображении (я не тестировал эту часть - я тестировал код на графике с панели, но я думаю, что он будет работать и здесь.
Если ваша картинка находится в файле, и если это достаточно быстро для ваших потребностей, вы можете использовать инструмент командной строки convert
of ImageMagick, у него есть опция -vignette
. Чтобы вызвать это из программы c#, вы можете запустить ее через систему.Диагностика.Процесс.Начните, или вы используете эта оболочка .NET для ImageMagick.