C# 在uwpc中从路径绘制图形#
我正在尝试转换android方法来绘制任何类型的形状。下面是android代码和我尝试过的C#代码。我的C#代码根本不起作用,它给出了模棱两可的图形作为输出。 我在C#UWP中搜索了很多关于路径绘制的信息,类似于android.graphics.path,但没有找到任何关于UWP的信息 Android代码C# 在uwpc中从路径绘制图形#,c#,uwp,C#,Uwp,我正在尝试转换android方法来绘制任何类型的形状。下面是android代码和我尝试过的C#代码。我的C#代码根本不起作用,它给出了模棱两可的图形作为输出。 我在C#UWP中搜索了很多关于路径绘制的信息,类似于android.graphics.path,但没有找到任何关于UWP的信息 Android代码 public static Bitmap getPathBitmap(int width, int height, GraphicsSegment[] segments) { Rec
public static Bitmap getPathBitmap(int width, int height, GraphicsSegment[] segments) {
RectF rect = null;
Path path = new Path();
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.TRANSPARENT);
canvas.drawPaint(paint);
for (GraphicsSegment segment : segments) {
switch (segment.drawingType) {
case GraphicsSegment.T_MOVETO:
path.moveTo(segment.x, segment.y);
break;
case GraphicsSegment.T_LINETO:
path.lineTo(segment.x, segment.y);
break;
case GraphicsSegment.T_QUADTO:
path.quadTo(segment.x, segment.y, segment.x2, segment.y2);
break;
case GraphicsSegment.T_CUBICTO:
path.cubicTo(segment.x, segment.y, segment.x1, segment.y1, segment.x2, segment.y2);
break;
case GraphicsSegment.T_ARCTO:
rect = new RectF();
rect.set(segment.x, segment.y, segment.x1, segment.y1);
path.arcTo(rect, segment.x2, segment.y2, true);
break;
case GraphicsSegment.T_ADDOVAL:
rect = new RectF();
rect.set(segment.x, segment.y, segment.x1, segment.y1);
path.addOval(rect, Path.Direction.CW);
break;
case GraphicsSegment.T_CLOSE:
path.close();
break;
}
}
paint.setStrokeWidth(2);
paint.setStyle(Paint.Style.STROKE);
canvas.drawPath(path, paint);
return bitmap;
}
public WriteableBitmap getPathBitmap(int width, int height, GraphicsSegment[] segments)
{
List<int> points = new List<int>();
foreach (GraphicsSegment segment in segments)
{
if (segment.drawingType == GraphicsSegment.T_CLOSE)
continue;
points.Add((int)segment.X);
points.Add((int)segment.Y);
}
WriteableBitmap writeableBmp = BitmapFactory.New(width, height);
using (writeableBmp.GetBitmapContext())
{
writeableBmp.DrawPolyline(points.ToArray(), Colors.Blue);
}
return writeableBmp;
}
我尝试过的C#代码
public static Bitmap getPathBitmap(int width, int height, GraphicsSegment[] segments) {
RectF rect = null;
Path path = new Path();
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.TRANSPARENT);
canvas.drawPaint(paint);
for (GraphicsSegment segment : segments) {
switch (segment.drawingType) {
case GraphicsSegment.T_MOVETO:
path.moveTo(segment.x, segment.y);
break;
case GraphicsSegment.T_LINETO:
path.lineTo(segment.x, segment.y);
break;
case GraphicsSegment.T_QUADTO:
path.quadTo(segment.x, segment.y, segment.x2, segment.y2);
break;
case GraphicsSegment.T_CUBICTO:
path.cubicTo(segment.x, segment.y, segment.x1, segment.y1, segment.x2, segment.y2);
break;
case GraphicsSegment.T_ARCTO:
rect = new RectF();
rect.set(segment.x, segment.y, segment.x1, segment.y1);
path.arcTo(rect, segment.x2, segment.y2, true);
break;
case GraphicsSegment.T_ADDOVAL:
rect = new RectF();
rect.set(segment.x, segment.y, segment.x1, segment.y1);
path.addOval(rect, Path.Direction.CW);
break;
case GraphicsSegment.T_CLOSE:
path.close();
break;
}
}
paint.setStrokeWidth(2);
paint.setStyle(Paint.Style.STROKE);
canvas.drawPath(path, paint);
return bitmap;
}
public WriteableBitmap getPathBitmap(int width, int height, GraphicsSegment[] segments)
{
List<int> points = new List<int>();
foreach (GraphicsSegment segment in segments)
{
if (segment.drawingType == GraphicsSegment.T_CLOSE)
continue;
points.Add((int)segment.X);
points.Add((int)segment.Y);
}
WriteableBitmap writeableBmp = BitmapFactory.New(width, height);
using (writeableBmp.GetBitmapContext())
{
writeableBmp.DrawPolyline(points.ToArray(), Colors.Blue);
}
return writeableBmp;
}
public WriteableBitmap getPathBitmap(int-width、int-height、GraphicsSegment[]段)
{
列表点=新列表();
foreach(分段中的图形分段)
{
if(segment.drawingType==GraphicsSegment.T\u关闭)
继续;
添加((int)段.X);
点。添加((int)段.Y);
}
WriteableBitmap writeableBmp=BitmapFactory.New(宽度、高度);
使用(writeableBmp.GetBitmapContext())
{
writeableBmp.DrawPolyline(points.ToArray(),Colors.Blue);
}
返回writeableBmp;
}
GraphicsSegment是一个具有属性x、y、x1、y1、x2、y2的类,对应于第一个、第二个和第三个目标点的x、y坐标位置您应该在UWP上查看如何使用这些属性进行图形绘制。如何将其用于屏幕外绘图的示例。您可以使用Microsoft.Graphics.Canvas名称空间。只需执行以下步骤
public getPathBitmap(int width, int height, GraphicsSegment[] segments) {
CanvasRenderTarget _RenderImage = null;
CanvasDevice device = CanvasDevice.GetSharedDevice();
var logicalDpi = 96.0f;
//Step 01
var path = new CanvasPathBuilder(device);
foreach(GraphicsSegment segment in segments) {
switch (segment.drawingType) {
case GraphicsSegment.T_MOVETO:
path.BeginFigure(X-Cordinate Start Position, Y-Cordinate Start Position);
break;
case GraphicsSegment.T_LINETO:
path.AddLine(X-Cordinate Next Position, Y-Cordinate Next Position);
break;
case GraphicsSegment.T_QUADTO:
{
Vector2 point = new Vector2(X-Cordinate Control Position1, Y-Cordinate Control Position1);
Vector2 point2 = new Vector2(X-Cordinate Control Position2, Y-Cordinate Control Position2);
path.AddQuadraticBezier(point, point2);
}
break;
case GraphicsSegment.T_CUBICTO:
{
Vector2 point = new Vector2(X-Cordinate Control Position1, Y-Cordinate Control Position1);
Vector2 point2 = new Vector2(X-Cordinate Control Position2, Y-Cordinate Control Position2);
Vector2 point3 = new Vector2(X-Cordinate End Position, Y-Cordinate End Position);
path.AddCubicBezier(point, point2, point3);
}
break;
case GraphicsSegment.T_ARCTO:
{
//TODO:: Set centerPoint, radiusX, radiusY, startAngle, sweepAngle by your self based on your requirement
Vector2 centerPoint = Calculate();
path.AddArc(centerPoint, radiusX, radiusY, startAngle, sweepAngle);
}
break;
case GraphicsSegment.T_CLOSE:
path.EndFigure(CanvasFigureLoop.Closed);
break;
case GraphicsSegment.T_ADDOVAL:
{
//TODO:: Set endpoint,radiusX,radiusY,rotationAngle by your self based on your requirement
Vector2 endpoint = Calculate();
path.AddArc(endpoint, radiusX, radiusY, rotationAngle, CanvasSweepDirection.Clockwise, CanvasArcSize.Small);
}
break;
}
}
//Step 02
var g = CanvasGeometry.CreatePath(path);
_RenderImage = new CanvasRenderTarget(device, width, height, logicalDpi);
//Step 03
using(var ds = _RenderImage.CreateDrawingSession()) {
ds.Clear(Colors.Transparent);
//Step 05
ds.DrawGeometry(g, Colors.Blue, 3.0f);
}
//Step 05
//Here you have to convert CanvasRenderTarget object _RenderImage to your required format like bitmapimage,stream,stroageFile etc
return yourTypeFile;
}