2017-10-20 9 views
1

J'essaie d'utiliser ImageSharp pour éditer des images en F #. Je me bats pour obtenir les mutations image de travailImagesharp muter en F #

Pour faire une mutation d'image en C#, il semble que vous venez d'utiliser le mutate method and a lambda:

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

Normalement, pour changer C# lambdas à F #, je voudrais juste utiliser des fonctions anonymes, comme ceci:

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

Quand je le fais, je reçois l'erreur suivante:

No overloads match for method 'Mutate'. The available overloads are shown below (or in the Error List window).

Il semble que la méthode Mutate prend un ImageProcessor, mais pour une raison quelconque dans F #, le compilateur ne peut pas comprendre que la fonction anonyme est un ImageProcessor. Comment puis-je obtenir une mutation d'image pour travailler en F #?

+0

La méthode 'Mutate' a-t-elle des surcharges? –

+1

Je pense qu'il en a juste un: (extension) Image.Mutate et opérations TPixel: ValueType) (opérations []: IImageProcessor <'TPixel> []) : unit – Jonathan

+1

Ce type de paramètre ressemble à une interface, mais votre code C# transmet une expression lambda. Cela ne calcule pas. Êtes-vous sûr que c'est la seule surcharge? –

Répondre

5

F # peut convertir automatiquement à partir d'une fonction anonyme (fun ...) à un System.Action<_>, mais seulement si les types correspondent exactement. Ici, ils ne le font pas, car Kodachrome() ne renvoie pas unit. Vous devez donc ignorer sa valeur de retour:

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

F # est bizarre. Pourquoi aurait-il attendre une uint? –

+1

Non uint, unité. L'équivalent de F # de void. – Tarmil

+0

Je suis choqué de voir à quel point c'est facile! – Jonathan

2

Vous devrez convertir votre F # lambda dans une action explicite:

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