{"id":37067464,"url":"https://github.com/jordandjp/fimage","last_synced_at":"2026-01-14T07:55:31.226Z","repository":{"id":45021717,"uuid":"433584851","full_name":"jordandjp/fimage","owner":"jordandjp","description":"Apply color filters to images","archived":false,"fork":false,"pushed_at":"2022-01-27T18:56:17.000Z","size":8785,"stargazers_count":9,"open_issues_count":2,"forks_count":4,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-09-27T23:22:00.260Z","etag":null,"topics":["fimage","image","image-processing","python","rgb"],"latest_commit_sha":null,"homepage":"","language":"Python","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/jordandjp.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-11-30T21:01:16.000Z","updated_at":"2025-08-11T06:43:01.000Z","dependencies_parsed_at":"2022-09-02T18:30:41.576Z","dependency_job_id":null,"html_url":"https://github.com/jordandjp/fimage","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jordandjp/fimage","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jordandjp%2Ffimage","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jordandjp%2Ffimage/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jordandjp%2Ffimage/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jordandjp%2Ffimage/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jordandjp","download_url":"https://codeload.github.com/jordandjp/fimage/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jordandjp%2Ffimage/sbom","scorecard":{"id":532656,"data":{"date":"2025-08-11","repo":{"name":"github.com/jordandjp/fimage","commit":"770524b59d14e92080892feef16ff267bdbd36d9"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.7,"checks":[{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Code-Review","score":0,"reason":"Found 0/12 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":0,"reason":"23 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2024-48 / GHSA-fj7x-q9j7-g6q6","Warn: Project is vulnerable to: GHSA-cpwx-vrp4-4pq7","Warn: Project is vulnerable to: GHSA-gmj6-6f8f-6699","Warn: Project is vulnerable to: GHSA-h5c8-rqwp-cp95","Warn: Project is vulnerable to: GHSA-h75v-3vvj-5mfj","Warn: Project is vulnerable to: GHSA-q2x7-8rv6-6q7h","Warn: Project is vulnerable to: GHSA-fpfv-jqm9-f5jm","Warn: Project is vulnerable to: GHSA-qr4w-53vh-m672","Warn: Project is vulnerable to: PYSEC-2023-183","Warn: Project is vulnerable to: GHSA-3f63-hfp8-52jq","Warn: Project is vulnerable to: GHSA-44wm-f244-xhp3","Warn: Project is vulnerable to: GHSA-4fx9-vc88-q2xc","Warn: Project is vulnerable to: PYSEC-2023-227 / GHSA-8ghj-p4vj-mr35","Warn: Project is vulnerable to: PYSEC-2022-10 / GHSA-8vj2-vxx3-667w","Warn: Project is vulnerable to: PYSEC-2022-168 / GHSA-9j59-75qj-795w","Warn: Project is vulnerable to: GHSA-j7hp-h8jx-5ppr","Warn: Project is vulnerable to: PYSEC-2022-42979 / GHSA-m2vv-5vj5-2hm7","Warn: Project is vulnerable to: PYSEC-2022-8 / GHSA-pw3c-h7wp-cvhx","Warn: Project is vulnerable to: PYSEC-2022-9 / GHSA-xrcv-f9gm-v42c","Warn: Project is vulnerable to: PYSEC-2023-175","Warn: Project is vulnerable to: PYSEC-2022-42969","Warn: Project is vulnerable to: PYSEC-2024-187 / GHSA-rqc4-2hc7-8c8v","Warn: Project is vulnerable to: GHSA-jfmj-5v4g-7637"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-20T06:06:07.434Z","repository_id":45021717,"created_at":"2025-08-20T06:06:07.434Z","updated_at":"2025-08-20T06:06:07.434Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28413527,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T05:26:33.345Z","status":"ssl_error","status_checked_at":"2026-01-14T05:21:57.251Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["fimage","image","image-processing","python","rgb"],"created_at":"2026-01-14T07:55:30.610Z","updated_at":"2026-01-14T07:55:31.220Z","avatar_url":"https://github.com/jordandjp.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# FImage\n\nA Python module to apply and create multiples filters to images.\n\nYou need to be using Python 3.7 or greater to be able to use **FImage**.\n\n## Installation\n```python\npip install fimage\n```\n\n## Example\n\n### A Simple filter\n\nCreate a file `app.py`  with:\n\n```python\nfrom fimage import FImage\nfrom fimage.filters import Sepia\n\n\ndef main():\n    # replace 'my_picture.jpg' with the path to your image\n    image = FImage('my_picture.jpg')\n\n    # apply the Sepia filter to the image\n    image.apply(Sepia(90))\n\n    # save the image with the applied filter\n    image.save('my_picture_sepia.jpg')\n\n\nif __name__ == \"__main__\":\n    main()\n```\n\nNow, just run it :\n\n```python\npython app.py\n```\n\nThis is `my_picture.jpg` before the filter was applied\n\n\u003cimg alt=\"my_picture.jpg\" src=\"examples/img/my_picture.jpg\" width=\"400\" height=\"500\"\u003e\n\nAnd this is how new image `my_picture_sepia.jpg` looks like after the filter was applied\n\n\u003cimg alt=\"my_picture_sepia.jpg\" src=\"examples/img/my_picture_sepia.jpg\" width=\"400\" height=\"500\"\u003e\n\n**Note**:  *90 represents the adjustment value we want to use for applying a sepia tone to this picture, lower values will result an image with less sepia tone while higher values will give us an image with a notorious sepia tone.*\n\nMost of the filters **FImage** offers will need an adjustment value to be passed.\n\n### Applying multiple filters\n\n**FImage** offers more filters besides the Sepia one, even you can combine multiples filters to give a better look to your picture.\n\nModify the file `app.py` to import more filters from **FImage**\n\n```python\nfrom fimage import FImage\nfrom fimage.filters import Contrast, Brightness, Saturation\n\n\ndef main():\n    image = FImage('my_picture.jpg')\n\n    # apply the mutiple filters to the image\n    image.apply(\n        Saturation(20),\n        Contrast(25),\n        Brightness(15)\n    )\n\n    # save the image with the applied filter\n    image.save('my_picture_mixed.jpg')\n\n\nif __name__ == \"__main__\":\n    main()\n```\n\nWe run it by\n\n```python\npython app.py\n```\n\nAnd our new `my_picture_mixed.jpg` looks like\n\n\u003cimg alt=\"my_picture_mixed.jpg\" src=\"examples/img/my_picture_mixed.jpg\" width=\"400\" height=\"500\"\u003e\n\nThe order in which the filters are passed to the `apply` function matters, this is because the filters are applied in a sequential manner, so the next filter will be applied over the resultant image from the previous one.\n\nCurrently **FImage** supports the following filters:\n- **FillColor**\n- **Sepia**\n- **Contrast**\n- **Brightness**\n- **Saturation**\n- **Vibrance**\n- **Grayscale**\n- **Hue**\n- **Colorize**\n- **Invert**\n- **Gamma**\n- **Noise**\n- **Clip**\n- **Exposure**\n\n### Presets\n\nPresets are just the combinations of multiple filters with already defined adjustment values.\n\nLet’s change our `app.py` one more time to use the Presets\n```python\nfrom fimage import FImage\nfrom fimage.presets import SinCity\n\n\ndef main():\n    # replace 'my_picture.jpg' with the path to your image\n    image = FImage('my_picture.jpg')\n\n    # apply the SinCity preset to the image\n    image.apply(SinCity())\n\n    # save the image with the applied preset\n    image.save('my_picture_sincity.jpg')\n\n\nif __name__ == \"__main__\":\n    main()\n```\n\n After we run it, we get our new  `my_picture_sincity.jpg`\n\n\u003cimg alt=\"my_picture_sincity.jpg\" src=\"examples/img/my_picture_sincity.jpg\" width=\"400\" height=\"500\"\u003e\n\nCurrently supported Presets:\n- **SinCity**\n- **OrangePeel**\n- **Love**\n\n### Custom Presets\nIf you like the look your picture got after testing different filters and want to store this combination for applying it to more pictures, you can create your own Preset by just extending the `Preset` Class and specifying these filters and their adjust values in it.\n\nIn our `app.py` let’s do\n\n```python\nfrom fimage import FImage\nfrom fimage.presets import Preset\nfrom fimage.filters import Contrast, Brightness, Saturation\n\n\n# Create my custom preset and specify the filters to apply\nclass MyOwnPreset(Preset):\n    filters = [\n        Contrast(30),\n        Saturation(50),\n        Brightness(10),\n    ]\n\n\ndef main():\n    # replace 'my_picture.jpg' with the path to your image\n    image = FImage('my_picture.jpg')\n\n    # apply MyOwnPreset to the image\n    image.apply(MyOwnPreset())\n\n    # save the image with the applied preset\n    image.save('my_picture_custom.jpg')\n\n\nif __name__ == \"__main__\":\n    main()\n```\n\nThe new `my_picture_custom.jpg`\n\n\u003cimg alt=\"my_picture_custom.jpg\" src=\"examples/img/my_picture_custom.jpg\" width=\"400\" height=\"500\"\u003e\n\nNow, in this way `MyOwnPreset` has the combination of filters you like and you can use to modify more pictures.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjordandjp%2Ffimage","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjordandjp%2Ffimage","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjordandjp%2Ffimage/lists"}