{"id":15802006,"url":"https://github.com/christianhelle/gfic","last_synced_at":"2026-03-16T03:31:19.420Z","repository":{"id":34888506,"uuid":"187083127","full_name":"christianhelle/gfic","owner":"christianhelle","description":"A .NET Core based command line image processor written in F#","archived":false,"fork":false,"pushed_at":"2024-09-27T10:37:19.000Z","size":851,"stargazers_count":4,"open_issues_count":1,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-10-06T01:41:39.089Z","etag":null,"topics":["dotnet-core","fsharp","image-processing"],"latest_commit_sha":null,"homepage":"","language":"F#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/christianhelle.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"christianhelle","patreon":null,"open_collective":null,"ko_fi":"christianhelle","tidelift":null,"community_bridge":null,"liberapay":"christianhelle","issuehunt":null,"otechie":null,"lfx_crowdfunding":null,"custom":["https://paypal.me/christianhelle","https://buymeacoffee.com/christianhelle"]}},"created_at":"2019-05-16T18:42:38.000Z","updated_at":"2024-09-27T10:37:20.000Z","dependencies_parsed_at":"2023-02-14T04:25:19.943Z","dependency_job_id":"8da34979-ec62-49e8-95ee-8172954abc62","html_url":"https://github.com/christianhelle/gfic","commit_stats":null,"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/christianhelle%2Fgfic","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/christianhelle%2Fgfic/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/christianhelle%2Fgfic/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/christianhelle%2Fgfic/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/christianhelle","download_url":"https://codeload.github.com/christianhelle/gfic/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246620222,"owners_count":20806722,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dotnet-core","fsharp","image-processing"],"created_at":"2024-10-05T01:41:38.304Z","updated_at":"2026-03-16T03:31:19.410Z","avatar_url":"https://github.com/christianhelle.png","language":"F#","funding_links":["https://github.com/sponsors/christianhelle","https://ko-fi.com/christianhelle","https://liberapay.com/christianhelle","https://paypal.me/christianhelle","https://buymeacoffee.com/christianhelle","https://www.buymeacoffee.com/christianhelle"],"categories":[],"sub_categories":[],"readme":"[![Build status](https://ci.appveyor.com/api/projects/status/1pfk93w929w52dum/branch/master?svg=true)](https://ci.appveyor.com/project/christianhelle/gfic/branch/master)\n[![Build](https://github.com/christianhelle/gfic/actions/workflows/build.yml/badge.svg)](https://github.com/christianhelle/gfic/actions/workflows/build.yml)\n[![NuGet](https://img.shields.io/nuget/dt/gfic.svg?style=flat-square)]( https://www.nuget.org/packages/gfic)\n[![NuGet](https://img.shields.io/nuget/v/gfic.svg?style=flat-square)]( https://www.nuget.org/packages/gfic)\n[![buymeacoffee](https://img.shields.io/badge/buy%20me%20a%20coffee-donate-yellow.svg)](https://www.buymeacoffee.com/christianhelle)\n\n# gfic\n\nA .NET Core command line image processor that I started for no other reason than to learn F#.\n\nThe tool will scan the specified input folder for image files, resize the image by percentage if specified, apply the specified effect, and then save them to the specified output folder. The tool has multi-threading support where you can specify the maximum degree of parallelism but will by default only run on a single thread\n\n#### Supported effects\n\n- grayscale\n- blackwhite\n- lomograph\n- kodachrome\n- oilpaint\n- box blur\n- gaussian blur\n- gaussian sharpen\n- glow\n- invert\n- pixelate\n- polaroid\n- sepia\n- vignette\n\n### Installation\n\nThe tool can be installed as a .NET Core global tool that you can call from the shell / command line\n\n```\ndotnet tool install --global gfic\n```\n\nor by following the instructions [here](https://www.nuget.org/packages/gfic) to install a specific version of tool\n\n### Usage\n\n```\nUSAGE: gfic [--help] [--effect \u003cname\u003e] [--format \u003cformat\u003e] [--input \u003cpath\u003e] [--output \u003cpath\u003e] [--threads \u003cnumber\u003e] [--resize \u003cpercentage\u003e]\n\nOPTIONS:\n\n    --effect, -e \u003cname\u003e   Specify the image processing effect. Available effects are grayscale, blackwhite, lomograph, kodachrome,\n                          oilpaint, boxblur, gaussianblur, gaussiansharpen, glow, invert, pixelate, polaroid, sepia, vignette, all\n    --format, -f \u003cformat\u003e File format (jpg, png, bmp, gif)\n    --input, -i \u003cpath\u003e    Specify a folder for source images\n    --output, -o \u003cpath\u003e   Specify the output folder.\n    --threads, -m \u003cnumber\u003e\n                          Specify the maximum degree of parallelism. Default is 1\n    --resize, -r \u003cpercentage\u003e\n                          Resize the image by percentage\n    --help                display this list of options.\n```\n\n### Examples\n\nHere's an example of how an original image might look like\n\n![Before](https://github.com/christianhelle/gfic/raw/master/images/original/guitar1.jpg)\n\n#### Then after applying some effects\n\n```\ngfic --input .\\ --output .\\output --effect grayscale\n```\n\n![After](https://github.com/christianhelle/gfic/raw/master/images/grayscale/guitar1.jpg)\n\n```\ngfic --input .\\ --output .\\output --effect lomograph\n```\n\n![After](https://github.com/christianhelle/gfic/raw/master/images/lomograph/guitar1.jpg)\n\n```\ngfic --input .\\ --output .\\output --effect oilpaint\n```\n\n![After](https://github.com/christianhelle/gfic/raw/master/images/oilpaint/guitar1.jpg)\n\n```\ngfic --input .\\ --output .\\output --effect gaussiansharpen\n```\n\n![After](https://github.com/christianhelle/gfic/raw/master/images/gaussiansharpen/guitar1.jpg)\n\n```\ngfic --input .\\ --output .\\output --effect sepia\n```\n\n![After](https://github.com/christianhelle/gfic/raw/master/images/sepia/guitar1.jpg)\n\n```\ngfic --input .\\ --output .\\output --effect vignette\n```\n\n![After](https://github.com/christianhelle/gfic/raw/master/images/vignette/guitar1.jpg)\n\n```\ngfic --input .\\ --output .\\output --effect polaroid\n```\n\n![After](https://github.com/christianhelle/gfic/raw/master/images/polaroid/guitar1.jpg)\n\nIt's also possible to apply all supported effects by specifying **--effect all**\n\n```\ngfic --input .\\input\\ --output .\\output --effect all\n\n00:00:00.1495793 - (grayscale) .\\images\\guitar1.jpg\n00:00:00.0688985 - (blackwhite) .\\images\\guitar1.jpg\n00:00:00.0880889 - (lomograph) .\\images\\guitar1.jpg\n00:00:00.0662329 - (kodachrome) .\\images\\guitar1.jpg\n00:00:00.1943901 - (oilpaint) .\\images\\guitar1.jpg\n00:00:00.1257821 - (boxblur) .\\images\\guitar1.jpg\n00:00:00.1368524 - (gaussianblur) .\\images\\guitar1.jpg\n00:00:00.0871363 - (gaussiansharpen) .\\images\\guitar1.jpg\n00:00:00.0497155 - (glow) .\\images\\guitar1.jpg\n00:00:00.0476376 - (invert) .\\images\\guitar1.jpg\n00:00:00.0564792 - (pixelate) .\\images\\guitar1.jpg\n00:00:00.0675103 - (polaroid) .\\images\\guitar1.jpg\n00:00:00.0488536 - (sepia) .\\images\\guitar1.jpg\n00:00:00.0552082 - (vignette) .\\images\\guitar1.jpg\n00:00:00.0540388 - (grayscale) .\\images\\guitar2.jpg\n00:00:00.0526321 - (blackwhite) .\\images\\guitar2.jpg\n00:00:00.0533533 - (lomograph) .\\images\\guitar2.jpg\n00:00:00.0527740 - (kodachrome) .\\images\\guitar2.jpg\n00:00:00.1286677 - (oilpaint) .\\images\\guitar2.jpg\n00:00:00.0709969 - (boxblur) .\\images\\guitar2.jpg\n00:00:00.0743339 - (gaussianblur) .\\images\\guitar2.jpg\n00:00:00.0773348 - (gaussiansharpen) .\\images\\guitar2.jpg\n00:00:00.0597320 - (glow) .\\images\\guitar2.jpg\n00:00:00.0287875 - (invert) .\\images\\guitar2.jpg\n00:00:00.0150577 - (pixelate) .\\images\\guitar2.jpg\n00:00:00.0156321 - (polaroid) .\\images\\guitar2.jpg\n00:00:00.0128757 - (sepia) .\\images\\guitar2.jpg\n00:00:00.0203237 - (vignette) .\\images\\guitar2.jpg\n\nTotal time: 00:00:01.9884109\n\n```\n\nThis will create sub folders under the specified output folder that describes the applied effect\n\n```\nls .\\output\\\n\n    Directory: C:\\test\\images\\output\n\nMode                LastWriteTime         Length Name\n----                -------------         ------ ----\nd-----        5/19/2019   2:19 PM                blackwhite\nd-----        5/19/2019   2:55 PM                boxblur\nd-----        5/19/2019   2:55 PM                gaussianblur\nd-----        5/19/2019   2:55 PM                gaussiansharpen\nd-----        5/19/2019   2:55 PM                glow\nd-----        5/19/2019   2:19 PM                grayscale\nd-----        5/19/2019   2:55 PM                invert\nd-----        5/19/2019   2:19 PM                kodachrome\nd-----        5/19/2019   2:19 PM                lomograph\nd-----        5/19/2019   2:19 PM                oilpaint\nd-----        5/19/2019   2:55 PM                pixelate\nd-----        5/19/2019   2:55 PM                polaroid\nd-----        5/19/2019   2:55 PM                sepia\nd-----        5/19/2019   2:55 PM                vignette\n```\n\n### Future\n\nI will add a bunch of CLI arguments for batch image processing operations like: brigten, darken, and the ability to combine multiple images into a collage and apply effects to it\n\n#\n\nFor tips and tricks on software development, check out [my blog](https://christianhelle.com)\n\nIf you find this useful and feel a bit generous then feel free to [buy me a coffee](https://www.buymeacoffee.com/christianhelle) :)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchristianhelle%2Fgfic","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchristianhelle%2Fgfic","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchristianhelle%2Fgfic/lists"}