如何利用C#编程实现灯光衰减的效果,我需要的是像灯光一样,外发光要有衰减,是如何实现的?
你可以使用PathGradientBrush来做图形的渐变。
代码如下:
using System.Drawing.Drawing2D;
private void Form19_Paint(object sender, PaintEventArgs e)
{
GraphicsPath graphicsPath = new GraphicsPath();
graphicsPath.AddEllipse(new Rectangle(0, 0, 200, 200));
PathGradientBrush pathGradientBrush = new PathGradientBrush(graphicsPath);
pathGradientBrush.CenterColor = Color.FromArgb(255, 232, 3);
pathGradientBrush.CenterPoint = new PointF(100, 100);
pathGradientBrush.SurroundColors = new Color[] { Color.Transparent };
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
e.Graphics.FillEllipse(pathGradientBrush, new Rectangle(0, 0, 200, 200));
graphicsPath.Dispose();
pathGradientBrush.Dispose();
}
您好,我还想问一下如果我读入一个PNG图片,能重新作出渐变的填充?另外可以做出类似光芒射线的效果吗?
如果要做图片的左右或上下的渐变比较容易,如果要做中心的渐变就比较麻烦了,给你简单写了左右渐变的例子。
代码如下:
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
private void button1_Click(object sender, EventArgs e)
{
Bitmap bitmap = Bitmap.FromFile("d:\\baidu.gif") as Bitmap;
Bitmap newBitmap = ImageGradient(bitmap);
pictureBox1.Image = bitmap;
pictureBox2.Image = newBitmap;
}
private Bitmap ImageGradient(Bitmap bitmap)
{
Bitmap newBitmap = new Bitmap(bitmap, bitmap.Width, bitmap.Height);
BitmapData bitmapData = newBitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppPArgb);
byte[] byteArr = new byte[bitmapData.Stride * bitmapData.Height];
Marshal.Copy(bitmapData.Scan0, byteArr, 0, byteArr.Length);
int index;
for (int i = 0; i < bitmapData.Height; i++)
{
index = i * bitmapData.Stride + 3;
for (int j = 0; j < bitmapData.Width; j++)
{
byteArr[index] = (byte)(255 - (float)j / bitmapData.Width * 255);
index += 4;
}
}
Marshal.Copy(byteArr, 0, bitmapData.Scan0, byteArr.Length);
newBitmap.UnlockBits(bitmapData);
return newBitmap;
}
光芒射线的代码发不上去了,你再追问一下吧。
对于我这个不懂的,我会用一幅黑色的图挡在前面,通过调节这幅黑色图片的透明度来控制用户对背后的亮光的看到程度,当然,这个是整幅图的一起遮挡或不同透明程度的遮挡
原理一样,想要有衰减,就不能统一设置一样的透明度,以光亮中心为圆心,不同的半径用不同的透明度,从小半径到大半径,透明度从大到小,当然这个涉及到一个执行效率的问题
当然也可以直接对原图处理好,在PS中处理好灯光衰减效果,前面的黑色遮挡层,设置透明度就可以了
当然也可以直接对原图中的像素进行调节达到效果,就不需要什么遮挡层了
当然,还是效率问题,自己研究,表示没怎么学过图片处理
我说的是自己绘图,先绘制原图,再覆盖绘制带有不同透明度的前景图片
广告 您可能关注的内容 |