首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 超酷圖像特效(七):光照效果實作

     編輯:關於C語言

前言

本系列第七篇,實作「光照效果」:以圖像中心為光源,半徑 R 範圍內像素亮度隨距離衰減,模擬聚光燈/暈光效果。

效果原理

  1. 光源中心 Center = (W/2, H/2),半徑 R = min(W,H)/2。
  2. 對每像素計算到中心距離 dist = sqrt((x-Cx)² + (y-Cy)²)。
  3. 若 dist < R,亮度增量 Δ = 220 * (1 - dist/R),線性衰減至邊緣為 0。
  4. RGB 各通道加 Δ,限制在 [0,255]。

完整程式碼


private void btnLight_Click(object sender, EventArgs e)
{
    using (var g = pictureBox1.CreateGraphics())
    {
        g.Clear(Color.White);
        using (var src = new Bitmap(pictureBox1.Image, pictureBox1.Width, pictureBox1.Height))
        using (var img = src.Clone(new RectangleF(0, 0, src.Width, src.Height), PixelFormat.DontCare))
        {
            int w = img.Width, h = img.Height;
            var center = new Point(w / 2, h / 2);
            int R = Math.Min(w, h) / 2;

            for (int x = w - 1; x >= 1; x--)
                for (int y = h - 1; y >= 1; y--)
                {
                    float dist = (float)Math.Sqrt(Math.Pow(x - center.X, 2) + Math.Pow(y - center.Y, 2));
                    if (dist < R)
                    {
                        Color c = img.GetPixel(x, y);
                        float delta = 220f * (1f - dist / R);
                        int r = Clamp(c.R + (int)delta);
                        int g_ = Clamp(c.G + (int)delta);
                        int b = Clamp(c.B + (int)delta);
                        img.SetPixel(x, y, Color.FromArgb(255, r, g_, b));
                    }
                }
            g.DrawImage(img, new Rectangle(0, 0, w, h));
        }
    }
}

int Clamp(int v) => v < 0 ? 0 : (v > 255 ? 255 : v);

效果圖

光照效果

擴充變體

  • 多光源:疊加多個光源亮度增量。
  • 彩色光源:各通道不同衰減係數 (如紅光、藍光)。
  • 動態光源:滑鼠移動更新 Center,即時重繪。
  • 非線性衰減:高斯、指數衰減模擬真實光照。

結語

光照效果展示距離衰減亮度調整核心邏輯。結合高效像素存取與參數化光源模型,可構建豐富的 2D 光照渲染系統。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved