创建一个不错的阴影效果是使用WinForms和GDI +相当的任务。
它既没有多边形缩放也没有模糊;让我们不要去想3D ......! - 但是我们至少可以做很少的事情,而不需要太多的工作,并且可以为许多图像获得不错的结果。
假设您已经有一张从背景中删除的图像。
下一步是将所有颜色变成黑色。
那么我们很可能会想要添加一些透明度级别,以便阴影落在背景上,仍然透过。
通过使用合适的ColorMatrix
可以非常有效地完成这两项任务。
对于非常透明的版本,我们也可以通过使用偏移绘制图像来创建简单的模糊。为了达到最佳效果我会画它与3型动物权/ alpha值九次..
高品质的模糊是一门艺术,你可以通过哪怕只是看着像Adobe公司的Photoshop或过滤器和调整Pro软件看亲和照片。这里是一个有趣的链接nice ..
但是,因为我们只处理ab/w位图一个simplitstic appraoch是足够好..我使用5%,10%和20%的3 alpha值为4角落,4边缘和1中心图纸。
最后一步是绘制一些歪斜的阴影。
这是解释here;但虽然这看起来非常简单,但也有点不切实际。需要计算以上三点DrawImage
覆盖图。
所以这里有一个方法,请注意,这是一种强烈简化的方法:
叠加需要三点,即浮点数。我们只使用数字:
- 一个为偏斜量;
0.5
表示顶部向右移动位图宽度的一半。
- 另外两个是结果边界框的缩放比例。
1
和0.5
表示宽度不变,高度降低到50%
。
下面是函数:
public Bitmap SkewBitmap(Bitmap inMap, float skewX, float ratioX, float ratioY)
{
int nWidth = (int)(inMap.Width * (skewX + ratioX));
int nHeight = (int)(Math.Max(inMap.Height, inMap.Height * ratioY));
int yOffset = inMap.Height - nHeight;
Bitmap outMap = new Bitmap(nWidth, nHeight);
Point[] destinationPoints = {
new Point((int)(inMap.Width * skewX), (int)(inMap.Height * ratioY) + yOffset),
new Point((int)(inMap.Width * skewX + inMap.Width * ratioX),
(int)(inMap.Height * ratioY) + yOffset),
new Point(0, inMap.Height + yOffset) };
using (Graphics g = Graphics.FromImage(outMap))
g.DrawImage(inMap, destinationPoints);
return outMap;
}
注意的几个简化:
如果你要删除的影子,你需要不只是移动前两个左指向左侧,也适应宽度的计算以及覆盖物体在阴影上的方式。
如果你研究MSDN的例子,你会发现DrawImage
覆盖也允许做一个旋转。我没有将它添加到我们的函数中,因为计算更复杂,甚至只是写一个签名。
如果你想知道的六个号码的信息去了,这里是完整布局:
- 3进入我们的参数
- 1是我们不这样做的旋转角度
- 2可能是要么旋转中心点或点(DELTAX & Y)的通过,结果被翻译
如果你仔细观察ÿ你可以看到左脚的影子是脚下的一点。这是因为脚不在同一水平面上,并且垂直压缩时基线会分开。为了纠正这一点,我们要么修改图像,要么加入微小的旋转。
看着你的例子,很明显,你需要把它拆开,分别处理'房子'和'树'!
签名保持简单;这总是在易于使用和编码努力之间取得平衡。可能希望参数具有控制倾斜的角度。随意制定出必要的计算..
注意添加其他按钮背后的功能将超越问题的范围。只要说大多数只是一条线就可以完成绘图,十几条就可以设置颜色矩阵了。
这里是在“倾斜”按钮的代码:
Bitmap bmp = SkewBitmap((Bitmap)pictureBox4.Image, 0.5f, 1f, 0.5f);
pictureBox5.Image = pictureBox1.Image;
pictureBox5.BackgroundImage = bmp;
pictureBox5.ClientSize = new Size(bmp.Width, bmp.Height);
而不是绘制对象在阴影我利用PictureBox
的额外层。你当然会合并这两个Bitmaps
..
你尝试[skewing?](https://msdn.microsoft.com/en-us/library/3b575a03(v = vs.110).aspx) - 注意这仍然是严格的2d! – TaW
哦,不,这对我来说是新的。我尝试 –
我试试,但我看到图像翻转或非常小。一个例子? –