所以我使用以下代码从输入表单中获取现有图像,文本,然后将输入表单中的文本放到现有图像上并将其另存为新图像:
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) 我使用DrawingContext.DrawText和DrawingContext.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) 我没有在Google或Stack Overflow上找到任何有用的东西,或者根本没有答案(或者也许我只是不知道要搜索什么)-我能找到的最接近的问题是:在性能低下的原因WPF
但是我想在这个简单的程序中解决这个滞后的原因,也许我只是做的不好。
我正在UI元素的OnRender()中渲染大约2000个点,并且它们之间有线,实际上是在创建线图。没关系,但我想使用MouseMove平移图形。效果很好,但问题是LAG。每当我用鼠标拖动时,我都会期望平滑的更新,我认为重绘2000点并在它们之间有线是在i5 CPU上漫步。但是,即使在我家里的笔记本电脑上分辨率很低时,它的速度也非常慢。因此,我检查了性能分析器。OnRender()函数几乎不使用任何CPU。
事实证明,正在更改和使用大量CPU的是Layout。
“版式”花费最多的时间来完成
现在,我听到了术语“视觉树”的话题,但是在这个简单的项目中几乎没有任何视觉效果。只是主窗口上的UI元素。而且它使用的是绘图上下文,我以为绘图上下文就像位图一样绘制,或者它是使用自己的事件/命中框等绘制UI元素的?因为我想要的只是让UIElement像图像一样工作,而且还要处理鼠标事件,所以我可以拖动整个对象(或使用鼠标滚轮缩放)。
所以问题:
来源如下:
.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#和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#的理解(我对它完全陌生)......
关于我如何设置和工作的任何提示?
有人知道是否有可能保存或转换DrawingContext为Geometry?
比如之后
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)
以某种方式保存几何中绘制的对象?
因此,我使用 DrawingContext 和 DrawingVisual 生成透明 PNG。
在 DrawingContext 中,我画了一个矩形。
我现在想在矩形内“切出”一个圆。我该怎么做呢?我没有找到任何绘制上下文来清除区域的函数。
我正在尝试创建自己的图形用户控件,我已经有一个已经在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) 我需要将文本垂直对齐到顶部或底部或中心.有水平对齐的FormattedText.TextAlignment属性,但没有垂直对齐的属性.
要明确Google不理解的内容:我对旋转文本垂直流动不感兴趣.我知道该怎么做.我只想让(可能是多行)文本在中心点的上方或下方或中间对齐.
谁知道怎么做?
我有一个绘图视觉,我有图纸,如何将其添加到我的画布和显示?
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.
我正在使用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) drawingcontext ×10
wpf ×9
c# ×6
canvas ×2
alignment ×1
blurry ×1
draw ×1
drawellipse ×1
drawing ×1
frame-rate ×1
kinect ×1
onrender ×1
text ×1
uielement ×1