Применение эффекта рельефа (тиснения) к растровому изображению с помощью GetPixel/SetPixel в C# WinFormsC#

Место общения программистов C#
Anonymous
Применение эффекта рельефа (тиснения) к растровому изображению с помощью GetPixel/SetPixel в C# WinForms

Сообщение Anonymous »

Я пытаюсь применить простой эффект рельефа (похожий на тиснение) к изображению в приложении WinForms с помощью Bitmap.GetPixel и SetPixel.
Идея состоит в том, чтобы сравнить яркость текущего пикселя со смещенным пикселем (смещением на 5 пикселей) и вычислить новое значение оттенков серого.
Вот мой код:

Код: Выделить всё

public static void ApplyReliefEffect(Form form)
{
if (ImageStorage.bitmap != null)
{
int brightness;
int brightness1;
int brightness2;

Bitmap sourceBitmap = new Bitmap(ImageStorage.bitmap);
Bitmap offsetBitmap = new Bitmap(ImageStorage.bitmap);

Color currentPixel;
Color offsetPixel;

Graphics graphics = form.CreateGraphics();

for (int x = 5; x < sourceBitmap.Width; x++)
{
for (int y = 5; y < sourceBitmap.Height; y++)
{
currentPixel = sourceBitmap.GetPixel(x, y);
offsetPixel = offsetBitmap.GetPixel(x - 5, y - 5);

brightness1 = CalculateBrightness(currentPixel);
brightness2 = CalculateBrightness(offsetPixel);

brightness = 150 + (brightness2 - brightness1);

if (brightness < 0)
{
brightness = 0;
}
else if (brightness > 255)
{
brightness = 255;
}

sourceBitmap.SetPixel(x, y, Color.FromArgb(brightness, brightness, brightness));
}
}

graphics.DrawImage(sourceBitmap, 25, 50);
graphics.Dispose();
}
}
ИИ миллион раз пытался сказать мне, что это безумно неоптимальный способ сделать это, и предлагает вместо этого использовать LockBits. Но я не понимаю, что делает это так медленно? Я не понимаю разницы между ними (и, черт возьми, я пытался понять :D). Не могли бы вы помочь, пожалуйста? Заранее спасибо!

Вернуться в «C#»