【问题标题】:Draw shadow around images在图像周围绘制阴影
【发布时间】:2017-03-13 14:06:44
【问题描述】:

在我的应用程序中,我正在合并不同的图像文件,这些文件将成为我的谷歌地图应用程序的标记。这是标记之后的样子

这就是我实现它的方式

foreach (ImageInfo imageInfo in files)
{

System.Drawing.Bitmap image = new System.Drawing.Bitmap(imageInfo.path);

g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;

if (imageInfo.position == ImagePosition.Base)
{
    if (imageInfo.isZoomed)
        isZoomed = true;
    g.DrawImage(image, new System.Drawing.Rectangle(0, 0, image.Width, image.Height));
}
else if (imageInfo.position == ImagePosition.TopRight)
{
    g.DrawImage(image, new System.Drawing.Rectangle(image.Width + 70, 10, 200, 200));
}

else if (imageInfo.position == ImagePosition.TopLeft)
{
    g.DrawImage(image, new System.Drawing.Rectangle(10, -10, 200, 200));
}

else if (imageInfo.position == ImagePosition.BottomRight)
{
    g.DrawImage(image, new System.Drawing.Rectangle(image.Width + 70, image.Height - 40, 200, 200));
}

}

我唯一缺少的是标记周围的阴影,在这里你可以看到我在说什么。上图中的标记周围有一个轻微的阴影。

有人知道怎么实现吗?

【问题讨论】:

  • 啊哈,一个控制台应用程序。我已为您添加了该标签,因此您会得到可能提供帮助的人的更多关注。
  • 您应该考虑添加 GDI+ 作为标签,因为这与 WinForm 或控制台无关。它只是 GDI+。我真的不明白你所说的影子是什么意思。
  • 您是否考虑过使用 Visual / RenderTargetBitmap 来绘制它? (WPF) 你可以在那里使用 DropShadowEffect。
  • 您不一定需要 WinForm 或 WPF 项目来使用 WPF 元素。我猜你确实可以像@ManfredRadlwimmer 所说的那样使用 Visual 和 RenderTargetBitmap 。不过,可能需要在您的 Main 方法上设置 [STAThread]。但是由于您使用的是圆形图标,因此您也可以简单地使用它们的宽度/高度作为直径在它们周围画一条弧线。

标签: c# gdi+ gdi windows-console


【解决方案1】:

这就是我最终解决的方法

位图阴影 = (Bitmap)finalImage.Clone();

for (int y = 0; y

for (int x = 0; x < shadow.Width; x++)
{
    var color = shadow.GetPixel(x, y);

    color = Color.FromArgb((int)((double)color.A * 0.2), 0, 0, 0);

    shadow.SetPixel(x, y, color);

}
}

var finalComposite = new Bitmap(finalImage.Width, finalImage.Height, PixelFormat.Format32bppArgb);

using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(finalComposite))
{
g.Transform = new Matrix(new Rectangle(0, 0, shadow.Width, shadow.Height), new Point[]{
    new Point(50,20),
    new Point(width+50, 20),
    new Point(0, height)
});

g.DrawImageUnscaled(shadow, new Point(0, 0));

g.ResetTransform();
g.DrawImageUnscaled(finalImage, new Point(0, 0));
}

【讨论】:

  • GetPixel/SetPixel 非常慢,但如果这不打扰你 - 很好。否则,您可以通过将合适的 ColorMatrix 传递给 DrawImage 调用来实现相同的目的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多