繁体   English   中英

带有GDI +的对角阴影

[英]Diagonal Shadow with 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中创建):

使用Winforms和GDI +创建漂亮的阴影是一项艰巨的任务。

它既没有多边形缩放也没有模糊的功能; 甚至不考虑3D。 -但是我们至少可以在不做太多工作的情况下做一些事情,并且可以为许多图像带来不错的效果。

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

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

然后,我们很可能希望增加一定程度的透明度,以使阴影所覆盖的背景仍然发光。

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

使用非常透明的版本,我们还可以通过使用偏移绘制图像来创建简单的模糊。 为了获得最佳效果,我将使用3个不同的权重/ alpha值绘制九次。

如您所见,即使仅查看Adobe PhotoshopAffinity Photo等专业软件中的滤镜和调整,也可以看到高质量的模糊艺术。 这里是一个很好的一套有趣的链接..

但是因为我们只处理a / w位图,所以简单的方法就足够了。我将4个角,4个边和1个中心图使用3个5%,10%和20%的alpha值。

最后一步是稍微倾斜一下阴影。

在这里解释; 但是,尽管这看起来非常简单,但也有些不切实际。 需要计算DrawImage叠加层期望的三个点。

因此,这里有一种方法可以做到这一点; 请注意,这是一个非常简化的方法:

叠加层需要3个点,即6个浮点数。 我们只使用3个数字:

  • 一个用于偏斜量; 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)
  • 如果仔细观察,您会发现左脚的阴影在脚的下方。 这是因为支脚不在同一水平线上,并且在垂直压缩的情况下,基线漂移了。 要纠正这一点,我们要么修改图像,要么毕竟添加一个很小的旋转。

  • 查看您的示例图像,很明显,您将需要将其拆开并分别对待“房屋”和“树”!

  • 签名保持简单; 这始终在易用性和编码工作量之间取得平衡。 上可能希望有一个参数,采用角度来控制偏斜。 随时进行必要的计算。

在此处输入图片说明

注意,在其他按钮后面添加功能将超出问题的范围。 只需说大部分就可以完成绘制工作,只需要一行就可以完成颜色矩阵的设置。

这是“ Skew”按钮中的代码:

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组合在一起。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM