Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在uwpc中从路径绘制图形#_C#_Uwp - Fatal编程技术网

C# 在uwpc中从路径绘制图形#

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

我正在尝试转换android方法来绘制任何类型的形状。下面是android代码和我尝试过的C#代码。我的C#代码根本不起作用,它给出了模棱两可的图形作为输出。 我在C#UWP中搜索了很多关于路径绘制的信息,类似于android.graphics.path,但没有找到任何关于UWP的信息

Android代码

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名称空间。只需执行以下步骤

  • 使用CanvasPathBuilder(Microsoft.Graphics.Canvas.Geometry)像android一样构建路径
  • 使用路径创建CanvasGeometry(Microsoft.Graphics.Canvas.Geometry)
  • 创建CanvasDrawingSession实例
  • 使用CanvasDrawingSession实例使用DrawGeometry绘制图像
  • 将CanvasRenderTarget图像转换为所需格式
  • 以下是您可以尝试的示例代码:

    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;
    }