【问题标题】:Imagesharp mutate in F#F# 中的图像锐化突变
【发布时间】:2017-10-20 04:40:39
【问题描述】:

我正在尝试使用 ImageSharp 在 F# 中编辑图片。我正在努力让图像突变工作

要在 C# 中进行图像突变,看起来您只需使用 mutate method and a lambda:

image.Mutate(x => x.Kodachrome())

通常,要将 C# lambda 更改为 F#,我只需使用匿名函数,如下所示:

image.Mutate(fun x -> x.Kodachrome())

当我这样做时,我收到以下错误:

方法“变异”没有重载匹配。可用的重载如下所示(或在错误列表窗口中)。

看起来 Mutate 方法需要一个 ImageProcessor,但由于某种原因,在 F# 中编译器无法确定匿名函数是一个 ImageProcessor。如何让图像突变在 F# 中工作?

【问题讨论】:

  • Mutate 方法有重载吗?
  • 我认为它只有一个:(扩展)Image.Mutate IPixel和'TPixel:> ValueType)>( [] 操作:IImageProcessor []) : unit
  • 该参数类型看起来像一个接口,但您的 C# 代码正在传递一个 lambda 表达式。这不计算。你确定这是唯一的过载吗?

标签: f# imagesharp


【解决方案1】:

F# 可以自动从匿名函数 (fun ...) 转换为 System.Action<_>,但前提是类型完全匹配。在这里,他们没有,因为Kodachrome() 不会返回unit。所以你需要忽略它的返回值:

image.Mutate(fun x -> x.Kodachrome() |> ignore)

【讨论】:

  • F# 很奇怪。为什么它需要一个 uint?
  • 我很震惊解决这个问题是多么容易!
  • @Tarmil Ha,会写实际的库但看不懂简单的英文:)
【解决方案2】:

您需要将 F# lambda 显式转换为 Action:

image.Mutate <| Action<_> (fun x -> x.Kodachrome ())

【讨论】:

    猜你喜欢
    • 2011-11-09
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 2011-10-22
    • 2013-11-22
    • 1970-01-01
    相关资源
    最近更新 更多