如何在drawingcontext工具上显示阴影

时间:2014-11-03 08:45:04

标签: c# wpf drawingcontext

实际上我使用drawingContext.DrawRectangle方法在画布上绘制矩形。 我想在矩形上添加阴影效果..

drawingContext.DrawRectangle(new SolidColorBrush(graphicsObjectFillColor),
                             new Pen(new SolidColorBrush(ObjectColor), ActualLineWidth),
                             Rectangle);

或者我正在使用它来添加阴影..

 DropShadowEffect effect = new DropShadowEffect();
 effect = new DropShadowEffect { Color = Colors.Black, Direction = -45, Opacity = 0.5, ShadowDepth = 4};
 this.Effect = effect;

阴影正在显示,但是在图像上添加绘制所有工具的时间,因为shodow没有shawing 我正在使用

                    DrawingVisual vs = new DrawingVisual();
                    DrawingContext dc = vs.RenderOpen();

                    // Draw image
                    dc.DrawImage(image.Source, rect);

                    double scale = width / image.Source.Width;

                    // Keep old existing actual scale and set new actual scale.
                    double oldActualScale = drawingCanvas.ActualScale;

                    drawingCanvas.ActualScale = oldActualScale;

                    // Remove clip in the canvas - we set our own clip.
                    drawingCanvas.RemoveClip();

                    // Prepare drawing context to draw graphics
                    rect = new Rect(left, top, width, height);
                    dc.PushClip(new RectangleGeometry(rect));

                    double horizontalScale = Math.Abs((positionDrawingCanvas.X) - (positionImage.X));
                    double verticalScale = Math.Abs((positionDrawingCanvas.Y) - (positionImage.Y));

                    double difX = 0.0;
                    double difY = 0.0;
                    //if (horizontalScale != 0 && verticalScale != 0)
                    //{
                    //     //horizontalScale = Math.Abs((positionDrawingCanvas.X + Math.Abs((positionImage.X / sliderScale.Value - positionImage.X))) - (positionImage.X));
                    //     //verticalScale = Math.Abs((positionDrawingCanvas.Y + Math.Abs((positionImage.Y / sliderScale.Value - positionImage.Y))) - (positionImage.Y));
                    //    difX = (positionImage.X - positionImage.X / sliderScale.Value);
                    //    difY = (positionImage.Y - positionImage.Y / sliderScale.Value);
                    //}

                    dc.PushTransform(new TranslateTransform(difX + left - horizontalScale, difY+top - verticalScale));
                    dc.PushTransform(new ScaleTransform(1, 1));

                    // Ask canvas to draw overlays
                    drawingCanvas.Draw(dc);

                    // Restore old actual scale.
                    drawingCanvas.ActualScale = oldActualScale;

                    // Restore clip
                    drawingCanvas.RefreshClip();

                    dc.Pop();
                    dc.Pop();
                    dc.Pop();

                    dc.Close();
                    width = (Utilityhelper.GetDIPIndependentHorizontal(rect.Width));
                    height = (Utilityhelper.GetDIPIndependentVertical(rect.Height));

                    bmp = new RenderTargetBitmap((int)width, (int)(height), Utilityhelper.graphics.DpiX, Utilityhelper.graphics.DpiY, PixelFormats.Default);
                    //bmp = new RenderTargetBitmap((int)(scale * (rect.Width)), (int)(scale * (rect.Height)), scale * 96, scale * 96, PixelFormats.Default);
                    bmp.Render(vs);
                    sliderScale.Value = oldScale;
                    //imageBackground.Stretch = Stretch.Uniform;
                    //drawingCanvas.Width = (Utilityhelper.GetDIPDependentHorizontal(drawingCanvas.Width));
                    //drawingCanvas.Height = (Utilityhelper.GetDIPDependentVertical(drawingCanvas.Height));
                    return bmp;

2 个答案:

答案 0 :(得分:1)

您只需更改渲染方法

即可
RenderTargetBitmap bmp = new RenderTargetBitmap((int)width, (int)(height), DpiX, DpiY, PixelFormats.Default);
BitmapSource source = null;

if (bmp != null)
{
    bmp.Render(image);
    bmp.Render(drawingCanvas);
    source = bmp;
}

答案 1 :(得分:0)

以下是如何从wpf:

中的visual获取图像(位图)
        // render content into image
        var render = new RenderTargetBitmap((int)ContentPresenter.RenderSize.Width, (int)ContentPresenter.RenderSize.Height, 96, 96, PixelFormats.Default);
        render.Render(ContentPresenter);
        var encoder = new PngBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(render));
        using (var stream = new MemoryStream())
        {
            // create bitmap image
            encoder.Save(stream);
            var bitmap = new BitmapImage();
            bitmap.BeginInit();
            bitmap.StreamSource = stream;
            bitmap.CacheOption = BitmapCacheOption.OnLoad;
            bitmap.EndInit();
            bitmap.Freeze();
            // use BitmapImage
            ...
        }

ContentPresenter是一些视觉效果。