2017-02-18 90 views
1

我想绘制一个对角阴影。对角阴影与GDI +

首先,我做的所有像素为黑色:

接下来用一个简单的cicle这是结果

现在我想对角拉伸此图片模拟阴影。
我曾尝试:

Bitmap b = new Bitmap(tImage.Width + 100, tImage.Height); 
Graphics p = Graphics.FromImage(b); 
p.RotateTransform(30f); 
p.TranslateTransform(100f, -200f); 
p.DrawImage(tImage, new Rectangle(0, -20, b.Width+20, b.Height)); 

但图像旋转和平移。

请人对我有一个解决方案吗?

我需要它看起来像这样(在Photoshop中创建):

+1

你尝试[skewing?](https://msdn.microsoft.com/en-us/library/3b575a03(v = vs.110).aspx) - 注意这仍然是严格的2d! – TaW

+0

哦,不,这对我来说是新的。我尝试 –

+0

我试试,但我看到图像翻转或非常小。一个例子? –

回答

2

创建一个不错的阴影效果是使用WinForms和GDI +相当的任务。

它既没有多边形缩放也没有模糊;让我们不要去想3D ......! - 但是我们至少可以做很少的事情,而不需要太多的工作,并且可以为许多图像获得不错的结果。

假设您已经有一张从背景中删除的图像。

下一步是将所有颜色变成黑色。

那么我们很可能会想要添加一些透明度级别,以便阴影落在背景上,仍然透过。

通过使用合适的ColorMatrix可以非常有效地完成这两项任务。

对于非常透明的版本,我们也可以通过使用偏移绘制图像来创建简单的模糊。为了达到最佳效果我会画它与3型动物权/ alpha值九次..

高品质的模糊是一门艺术,你可以通过哪怕只是看着像Adob​​e公司的Photoshop或过滤器和调整Pro软件看亲和照片。这里是一个有趣的链接nice ..

但是,因为我们只处理ab/w位图一个simplitstic appraoch是足够好..我使用5%,10%和20%的3 alpha值为4角落,4边缘和1中心图纸。

最后一步是绘制一些歪斜的阴影

这是解释here;但虽然这看起来非常简单,但也有点不切实际。需要计算以上三点DrawImage覆盖图。

所以这里有一个方法,请注意,这是一种强烈简化的方法:

叠加需要三点,即浮点数。我们只使用数字:

  • 一个为偏斜量; 0.5表示顶部向右移动位图宽度的一半。
  • 另外两个是结果边界框的缩放比例。 10.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)的通过,结果被翻译
  • 如果你仔细观察ÿ你可以看到左脚的影子是脚下的一点。这是因为脚不在同一水平面上,并且垂直压缩时基线会分开。为了纠正这一点,我们要么修改图像,要么加入微小的旋转。

  • 看着你的例子,很明显,你需要把它拆开,分别处理'房子'和'树'!

  • 签名保持简单;这总是在易于使用和编码努力之间取得平衡。可能希望参数具有控制倾斜的角度。随意制定出必要的计算..

enter image description here

注意添加其他按钮背后的功能将超越问题的范围。只要说大多数只是一条线就可以完成绘图,十几条就可以设置颜色矩阵了。

这里是在“倾斜”按钮的代码:

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 ..

+0

坦克Ta!你太棒了。坦克为您提供帮助! –