gpt4 book ai didi

c# - 在 DrawingContext 上绘制时在图像上绘制阴影

转载 作者:行者123 更新时间:2023-11-30 14:37:45 27 4
gpt4 key购买 nike

我在自定义 FrameworkElement 的 OnRender 方法中绘制图像。我也想画这个图像的阴影。我需要在代码中执行此操作,并且我不想使用 DropShadowBitmapEffect,因为它已过时。我怎样才能做到这一点?

    public class MyDrawingView : FrameworkElement
{
protected override void OnRender(System.Windows.Media.DrawingContext dc)
{
drawImagesOnDrawingContext(dc);
}

public RenderTargetBitmap getBitmap()
{
DrawingVisual dv = new DrawingVisual();
using (DrawingContext dcMine = dv.RenderOpen())
{
drawImagesOnDrawingContext(dcMine);
dcMine.Close();
}
RenderTargetBitmap rtb = new RenderTargetBitmap(200, 200, 96, 96, PixelFormats.Pbgra32);
rtb.Render(dv);
return rtb;
}

private void drawImagesOnDrawingContext(System.Windows.Media.DrawingContext dc)
{
//how to draw shadow on bi?
BitmapImage bi = new BitmapImage(new Uri(@"D:\mytemp\img1.jpg"));
dc.DrawImage(bi, new Rect(50, 50, 100, 100));

//how to draw shadow on bi1
BitmapImage bi1 = new BitmapImage(new Uri(@"D:\mytemp\img2.jpg"));
dc.DrawImage(bi1, new Rect(30, 30, 100, 100));
}

}

请注意,下面 SvenG 建议的向底层元素添加效果的解决方案对我不起作用,因为它为整个元素提供了阴影,而不是我绘制的单个图像。例如,如果我有两个重叠的 DrawImage,建议的解决方案将考虑整体绘制阴影。上图的阴影不会绘制在下图上。

此外,我想使用 getBitmap 函数创建一个位图,如上所示,以导出带有阴影的绘制图像。

最佳答案

DrawingContext 上有一个旧的 PushEffect() 调用,它可以完成您的要求,但像 BitmapEffect 一样,它已经过时了。

BitmapEffect 的替代品是 Effect 类。有一个名为 DropShadowEffect 的子类正是您所追求的,但不幸的是,正如 SvenG 所说,这不能直接应用于位图。

支持应用效果的最低级别元素是 DrawingVisual 类。这还不算太糟糕,因为 DrawingVisual 是一个非常轻量级的类。没有布局开销。最好的办法是在其自己的 DrawingVisual 中创建每个位图,并将视觉对象的 Effect 属性设置为 DropShadowEffect。显然,如果您有数千张位图,这可能不是一个可行的解决方案。

所有这些都可以在代码中完成,尽管不是 OnRender() 因为每个视觉对象都有自己的渲染上下文。但是,要使子 DrawingVisual 正确呈现,您需要将它们告知框架。

您需要覆盖自定义元素中的两个方法才能看到这些视觉效果:VisualChildrenCount 说明您有多少个 child ,以及 GetVisualChild() 将它们返回给系统。因此,您需要保留一组可用的视觉效果。如果您想对它们进行 HitTest ,也可以调用 AddVisualChild()AddLogicalChild()

public class MyDrawingView : FrameworkElement
{
List<DrawingVisual> _visuals = new List<DrawingVisual>();

public MyDrawingView()
{
CreateVisuals();
}

//Gets a bitmap rendering of the visual and its children for saving as image file
public RenderTargetBitmap GetBitmap()
{
var rtb = new RenderTargetBitmap(200, 200, 96, 96, PixelFormats.Pbgra32);
rtb.Render(this);
return rtb;
}

protected override int VisualChildrenCount
{
get
{
return _visuals.Count;
}
}

protected override Visual GetVisualChild(int index)
{
return _visuals[index];
}

private void CreateVisuals()
{
CreateVisualForBitmap(@"D:\mytemp\img1.jpg", new Rect(50, 50, 100, 100));
CreateVisualForBitmap(@"D:\mytemp\img2.jpg", new Rect(30, 30, 100, 100));
}

private void CreateVisualForBitmap(string bitmapPath, Rect bounds)
{
var bitmap = new BitmapImage(new Uri(bitmapPath));
var visual = new DrawingVisual();
visual.Effect = new DropShadowEffect();

using (DrawingContext dc = visual.RenderOpen())
{
dc.DrawImage(bitmap, bounds);
}

_visuals.Add(visual);
AddVisualChild(visual);
AddLogicalChild(visual);
}
}

关于c# - 在 DrawingContext 上绘制时在图像上绘制阴影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8895371/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com