2

F#初学者在这里,我想用ImageSharp画一个多边形。构建失败:

方法“DrawPolygon”没有重载匹配。可用的重载如下所示。错误 FS0001:此表达式应具有“图像”类型,但此处具有“a * 'b”类型。

    let renderRect(img:Image<Rgba32>) =

        let points: PointF list = [
            new PointF(float32 2.0, float32 8.0);
            new PointF(float32 4.0, float32 1.0);
            new PointF(float32 1.0, float32 7.0);
            new PointF(float32 5.0, float32 2.0);
        ]

        img.Mutate (fun x -> x.DrawPolygon(Rgba32.White, 1.0, points))
        img

我要调用的方法的签名:

static IImageProcessingContext<TPixel> DrawPolygon<TPixel>(this IImageProcessingContext<TPixel> source, TPixel color, float thickness, params PointF[] points) where TPixel : struct, IPixel<TPixel>
4

2 回答 2

4

我看到几个问题:

  1. 正如 Aaron 所说,您正在传递一个需要数组的列表。
  2. to 的第二个参数DrawPolygon应该是 a float32,而不是 a float。请注意float32,您可以通过添加后缀来使用正确类型的文字,而不是调用该函数:1.0f
  3. to 的第二个参数必须Mutate是一个Action<_>,所以它不应该返回任何东西;这意味着您应该忽略DrawPolygon调用的结果而不是返回它。|> ignore您可以通过在通话后放置来实现这一点。

这是解决了这些问题的代码版本:

let renderRect(img:Image<Rgba32>) =

    let points = [|
        PointF(2.0f, 8.0f);
        PointF(4.0f, 1.0f);
        PointF(1.0f, 7.0f);
        PointF(5.0f, 2.0f);
    |]

    img.Mutate (fun x -> x.DrawPolygon(Rgba32.White, 1.0f, points) |> ignore)
    img

由于您没有包含完整的重现(甚至是错误消息中建议的重载列表!),因此很难知道是否还有其他需要更改的内容。

于 2018-08-21T19:19:16.750 回答
3

您正在传递一个点列表,但该方法的签名需要一个点数组。我建议将点内联传递为params,或将点定义为数组:

let points = 
    [|
        new PointF(float32 2.0, float32 8.0)
        new PointF(float32 4.0, float32 1.0)
        new PointF(float32 1.0, float32 7.0)
        new PointF(float32 5.0, float32 2.0)
    |]
于 2018-08-21T17:32:21.397 回答