本系列第十篇,實作「油畫效果」:在鄰域內隨機取樣像素色彩,模擬油畫筆觸質感。
iModel (如 2)。[x, x+iModel] × [y, y+iModel] 範圍隨機選取一像素色彩覆蓋當前像素。iModel 越大筆觸越明顯。
private void btnOilPaint_Click(object sender, EventArgs e)
{
using (var g = panel1.CreateGraphics())
{
int w = MyBitmap.Width, h = MyBitmap.Height;
using (var img = MyBitmap.Clone(new RectangleF(0, 0, w, h), PixelFormat.DontCare))
{
var rnd = new Random();
int model = 2;
for (int x = w - model; x > 1; x--)
{
for (int y = h - model; y > 1; y--)
{
int offset = rnd.Next(100000) % model;
Color c = img.GetPixel(x + offset, y + offset);
img.SetPixel(x, y, c);
}
}
g.Clear(Color.White);
g.DrawImage(img, new Rectangle(0, 0, w, h));
}
}
}

LockBits 存取像素資料,大幅提升速度。簡單的隨機鄰域取樣即可產生油畫質感。結合高效像素存取與進階濾波演算法,可達到專業級非真實感渲染 (NPR) 效果。