标签: drawingcontext

在DrawingContext中以一定角度绘制文本?

所以我使用以下代码从输入表单中获取现有图像,文本,然后将输入表单中的文本放到现有图像上并将其另存为新图像:

using (FileStream output = new FileStream(match_outputFile, FileMode.Create))
{
    BitmapImage bitmap = new BitmapImage(new Uri(match_sourceFile, UriKind.Relative));
    DrawingVisual visual = new DrawingVisual();

    using (DrawingContext image = visual.RenderOpen())
    {
        image.DrawImage(bitmap, new Rect(0, 0, bitmap.PixelWidth, bitmap.PixelHeight));

        buildText(image, "text1", this.text1.Text);
        buildText(image, "text2", this.text2.Text);
        buildText(image, "text3", this.text3.Text);
    }

    RenderTargetBitmap target = new RenderTargetBitmap(bitmap.PixelWidth, bitmap.PixelHeight, bitmap.DpiX, bitmap.DpiY, PixelFormats.Default);
    target.Render(visual);

    BitmapEncoder encoder = new PngBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(target));
    encoder.Save(output);
}
Run Code Online (Sandbox Code Playgroud)

如您所见,它调用以下函数来绘制文本:

private void buildText(DrawingContext image, string settings, string input)
{
    string[] setting = (Properties.Settings.Default[settings].ToString()).Split(',');

    FormattedText text = new FormattedText( …
Run Code Online (Sandbox Code Playgroud)

c# wpf drawingcontext drawingvisual

4
推荐指数
1
解决办法
3143
查看次数

WPF中的模糊转换文本

我使用DrawingContext.DrawTextDrawingContext.PushTransfrom创建在WPF视觉层旋转的文本,但正如你在下面的图片中看到的,旋转的文本是在图像的某些区域,而模糊的..

有什么我可以用来改善的选择吗?该宋体字体用于文本。

在此处输入图片说明

public class BeamTextDrawing : FrameworkElement
{
    private readonly VisualCollection _visuals;
    public BeamTextDrawing(double scale)
    {
        if (scale <= 0)
        {
            scale = 1;
        }
        var typeface = Settings.BeamTextTypeface;
        var cultureinfo = Settings.CultureInfo;
        var flowdirection = Settings.FlowDirection;
        var textsize = Settings.BeamTextSize / scale;
        var beamtextcolor = Settings.InPlanBeamTextColor;

        _visuals = new VisualCollection(this);

        foreach (var beam in Building.BeamsInTheElevation)
        {
            var drawingVisual = new DrawingVisual();
            using (var dc = drawingVisual.RenderOpen())
            {
                var text = Convert.ToString(beam.Section.Id);
                //text = …
Run Code Online (Sandbox Code Playgroud)

c# wpf blurry formatted-text drawingcontext

4
推荐指数
1
解决办法
913
查看次数

WPF MouseMove InvalidateVisual OnRender更新非常慢

我没有在Google或Stack Overflow上找到任何有用的东西,或者根本没有答案(或者也许我只是不知道要搜索什么)-我能找到的最接近的问题是:在性能低下的原因WPF

但是我想在这个简单的程序中解决这个滞后的原因,也许我只是做的不好。

我正在UI元素的OnRender()中渲染大约2000个点,并且它们之间有线,实际上是在创建线图。没关系,但我想使用MouseMove平移图形。效果很好,但问题是LAG。每当我用鼠标拖动时,我都会期望平滑的更新,我认为重绘2000点并在它们之间有线是在i5 CPU上漫步。但是,即使在我家里的笔记本电脑上分辨率很低时,它的速度也非常慢。因此,我检查了性能分析器。OnRender()函数几乎不使用任何CPU。

MouseMove和OnRender几乎不占用太多CPU

事实证明,正在更改和使用大量CPU的是Layout。

布局使用最多的CPU

“版式”花费最多的时间来完成

布局花费最多的时间 它说对Visual树进行了更改-但未进行任何更改-仅调用了InvalidateVisual

现在,我听到了术语“视觉树”的话题,但是在这个简单的项目中几乎没有任何视觉效果。只是主窗口上的UI元素。而且它使用的是绘图上下文,我以为绘图上下文就像位图一样绘制,或者它是使用自己的事件/命中框等绘制UI元素的?因为我想要的只是让UIElement像图像一样工作,而且还要处理鼠标事件,所以我可以拖动整个对象(或使用鼠标滚轮缩放)。

所以问题:

  1. 如果Layout造成速度缓慢/滞后,如何防止这种情况?
  2. 我还注意到有很多垃圾收集是有意义的,但是我不希望它在渲染期间发生。我宁愿在闲置时这样做。但是如何?

来源如下:

.cs文件

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Windows;
using System.Windows.Media;

namespace SlowChart
{
    public class SlowChartClass : UIElement
    {
        List<Point> points = new List<Point>();

        double XAxis_Width = 2000;
        double XAxis_LeftMost = 0;

        double YAxis_Height = 300;
        double YAxis_Lowest = -150;

        Point mousePoint;
        double XAxis_LeftMostPan = 0;
        double YAxis_LowestPan = 0;

        public SlowChartClass()
        {
            for (int i = 0; i < 2000; i++)
            {
                double cos = …
Run Code Online (Sandbox Code Playgroud)

c# wpf drawingcontext uielement

4
推荐指数
1
解决办法
762
查看次数

从文件到屏幕绘制骨架动画

我基本上要做的是使用C#和Kinect SDK(完成)将kinect骨架框架数据(关节位置)写入文件,然后在外部处理(完成),然后将数据读回我的应用程序(完成)并逐帧绘制数据作为光点步行者(骨架关节),所以我看到一个动画.(问题)

我的问题是:如何使用C#(及其DrawingContext类)绘制这个30fps的动画?

我想使用DrawingContext,因为我在录制时已经将它用于SkeletonFrames的实时输出.它就像这样完成,类似于"Skeleton Basics"SDK示例:

this.sensor.SkeletonFrameReady += this.SensorSkeletonFrameReady;
...

private void SensorSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
    {
        ...

        using (DrawingContext dc = this.drawingGroup.Open())
        {
        ...
           dc.DrawEllipse(drawBrush, null, 2Dpoint, JointThickness, JointThickness);

        }
    }
Run Code Online (Sandbox Code Playgroud)

所以kinect为我提供了大约的框架.30fps使用事件,我只是绘制数据.

但是,如果没有kinect但是从文件/内存中读取数据,我该如何绘制?(目前使用2DArray [Frame,Joint])

我想过让一个线程以30fps的速度运行(使用sleep来实现帧率)然后发送一个类似的事件或者直接绘制..但是我试图让这个工作完全失败了.例如,我没有将事件发送到主线程进行绘制.

问题可能是我缺乏对C#的理解(我对它完全陌生)......

关于我如何设置和工作的任何提示?

c# frame-rate kinect drawingcontext

3
推荐指数
1
解决办法
698
查看次数

将DrawingContext转换为Geometry?

有人知道是否有可能保存或转换DrawingContextGeometry

比如之后

using (DrawingContext dc = RenderOpen())
{
    dc.DrawLine(penSelected, Data.MidTop, Data.MidTop + vertical);
    dc.DrawLine(pen, Data.MidTop - horizontal, Data.MidTop + thickness);
    dc.DrawLine(pen, Data.MidTop + vertical - thickness, Data.MidTop + horizontal + vertical);
    dc.DrawText(new FormattedText(Data.Time2.ToString("0.0"), cultureinfo, FlowDirection.LeftToRight, typeface, 8, Brushes.Black),
        Data.MidTop + 3 * thickness);
    dc.DrawText(new FormattedText(Data.Time2.ToString("0.0"), cultureinfo, FlowDirection.LeftToRight, typeface, 8, Brushes.Black),
        Data.MidTop + vertical - horizontal - 3 * thickness);
}
Run Code Online (Sandbox Code Playgroud)

以某种方式保存几何中绘制的对象?

wpf drawingcontext

3
推荐指数
1
解决办法
595
查看次数

WPF 清除绘图上下文上的区域?

因此,我使用 DrawingContext 和 DrawingVisual 生成透明 PNG。

在 DrawingContext 中,我画了一个矩形。

我现在想在矩形内“切出”一个圆。我该怎么做呢?我没有找到任何绘制上下文来清除区域的函数。

wpf drawingcontext

3
推荐指数
1
解决办法
2696
查看次数

尝试在WPF窗口中绘制椭圆,但它不可见

我正在尝试创建自己的图形用户控件,我已经有一个已经在win表单上工作,我正在尝试将其移动到WPF世界中.

我开始学习如何绘图,所以我首先尝试绘制一个填充整个窗口的黑色椭圆,只是为了了解坐标在WPF中是如何工作的.

所以这里是代码,当我运行应用程序时,没有显示任何内容,任何想法我错过了什么?

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    protected override void OnRender(DrawingContext drawingContext)
    {
        base.OnRender(drawingContext);

        drawingContext.DrawEllipse(Brushes.Black, new Pen(Brushes.Black, 1), new Point(Width / 2, Height / 2), Width / 2, Height / 2);
    }
}
Run Code Online (Sandbox Code Playgroud)

wpf draw drawellipse drawingcontext onrender

2
推荐指数
1
解决办法
1926
查看次数

与DrawingContext.DrawText垂直对齐

我需要将文本垂直对齐到顶部或底部或中心.有水平对齐的FormattedText.TextAlignment属性,但没有垂直对齐的属性.

要明确Google不理解的内容:我对旋转文本垂直流动不感兴趣.我知道该怎么做.我只想让(可能是多行)文本在中心点的上方或下方或中间对齐.

谁知道怎么做?

wpf text alignment drawingcontext

2
推荐指数
1
解决办法
2738
查看次数

在画布上显示DrawingVisual

我有一个绘图视觉,我有图纸,如何将其添加到我的画布和显示?

 DrawingVisual drawingVisual = new DrawingVisual();

 // Retrieve the DrawingContext in order to create new drawing content.
 DrawingContext drawingContext = drawingVisual.RenderOpen();

 // Create a rectangle and draw it in the DrawingContext.
 Rect rect = new Rect(new System.Windows.Point(0, 0), new System.Windows.Size(100, 100));
 drawingContext.DrawRectangle(System.Windows.Media.Brushes.Aqua, (System.Windows.Media.Pen)null, rect);

 // Persist the drawing content.
 drawingContext.Close();
Run Code Online (Sandbox Code Playgroud)

如何将其添加到画布?假设我有一个Canvas

  Canvas canvas = null;
  canvas.Children.Add(drawingVisual); //Doesnt work as UIElement expected.
Run Code Online (Sandbox Code Playgroud)

如何将drawingVisual添加到画布?

TIA.

c# wpf drawing canvas drawingcontext

2
推荐指数
1
解决办法
4469
查看次数

如何在c# wpf应用程序中绘制具有不同z索引的多条线

我正在使用DrawingContext.DrawLine函数来画线。但看起来线条会影响画布上其他线条的位置。所以我需要为所有行添加不同的 z-index 值。有什么方法可以绘制具有不同 z-index 的线,这样它们就不会影响其他线的位置。或者是否有其他方法可用于绘制线条,例如绘制文本,我已将DrawText方法替换为TextBlock.

以下是我现在正在使用的示例代码:

DrawingGroup dGroup = new DrawingGroup();
DrawingContext dc = dGroup.Open()
dc.DrawLine(penScaleMarker, new Point((float)newPointX, (float)newPointY), new Point((float)newMinorEndX, (float)newMinorEndY));
Run Code Online (Sandbox Code Playgroud)

c# wpf canvas drawingcontext

2
推荐指数
1
解决办法
2272
查看次数