{"id":13621093,"url":"https://github.com/makew0rld/didder","last_synced_at":"2026-03-09T08:02:06.615Z","repository":{"id":41432999,"uuid":"362903245","full_name":"makew0rld/didder","owner":"makew0rld","description":"An extensive, fast, and accurate command-line image dithering tool.","archived":false,"fork":false,"pushed_at":"2026-02-04T01:57:10.000Z","size":98,"stargazers_count":480,"open_issues_count":6,"forks_count":14,"subscribers_count":7,"default_branch":"main","last_synced_at":"2026-02-18T04:35:33.629Z","etag":null,"topics":["command-line","dithering-algorithms","dithering-images","floyd-steinberg","ordered-dithering"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/makew0rld.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"makew0rld","ko_fi":"makeworld"}},"created_at":"2021-04-29T17:57:07.000Z","updated_at":"2026-02-14T16:11:09.000Z","dependencies_parsed_at":"2024-01-14T05:01:36.843Z","dependency_job_id":"ff66b501-1d66-4be9-8ad6-baf94eed89cb","html_url":"https://github.com/makew0rld/didder","commit_stats":{"total_commits":45,"total_committers":5,"mean_commits":9.0,"dds":0.3111111111111111,"last_synced_commit":"298b40bbf5e1c9eeabdc0a89fadaee0c642e568e"},"previous_names":["makeworld-the-better-one/didder"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/makew0rld/didder","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/makew0rld%2Fdidder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/makew0rld%2Fdidder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/makew0rld%2Fdidder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/makew0rld%2Fdidder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/makew0rld","download_url":"https://codeload.github.com/makew0rld/didder/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/makew0rld%2Fdidder/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30287446,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-09T02:57:19.223Z","status":"ssl_error","status_checked_at":"2026-03-09T02:56:26.373Z","response_time":61,"last_error":"SSL_read: 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":["command-line","dithering-algorithms","dithering-images","floyd-steinberg","ordered-dithering"],"created_at":"2024-08-01T21:01:02.459Z","updated_at":"2026-03-09T08:02:06.595Z","avatar_url":"https://github.com/makew0rld.png","language":"Go","funding_links":["https://github.com/sponsors/makew0rld","https://ko-fi.com/makeworld"],"categories":["Go"],"sub_categories":[],"readme":"# didder\n\n[![go reportcard](https://goreportcard.com/badge/github.com/makeworld-the-better-one/didder)](https://goreportcard.com/report/github.com/makeworld-the-better-one/didder)\n\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"david_dithered.png\" /\u003e\n\u003c/p\u003e\n\n\ndidder is an extensive, fast, and accurate command-line image dithering tool. It is designed to work well for both power users as well as pipeline scripting.\nIt is backed by my [dithering library](https://github.com/makeworld-the-better-one/dither), and is unique in its correctness and variety of dithering algorithms. No online or offline tool I know of provides as many options, while being correct (linearizing the image, weighting channels by luminance).\n\nA GUI version called [Dithertime](https://www.makeworld.space/2025/02/dithertime.html) is available on [itch.io](https://makew0rld.itch.io/dithertime).\n\n## Types of dithering supported\n\n- Random noise (in grayscale and RGB)\n- **Ordered Dithering**\n  - Bayer matrix of any size (as long as dimensions are powers of two)\n  - Clustered-dot - many different preprogrammed matrices\n  - Some unusual horizontal or vertical line matrices\n  - Yours? You can provide your own ordered dithering matrix in JSON format\n- **Error diffusion dithering**\n  - Simple 2D\n  - Floyd-Steinberg, False Floyd-Steinberg\n  - Jarvis-Judice-Ninke\n  - Atkinson\n  - Stucki\n  - Burkes\n  - Sierra/Sierra3, Sierra2, Sierra2-4A/Sierra-Lite\n  - [Steven Pigeon](https://hbfs.wordpress.com/2013/12/31/dithering/)\n  - Yours? You can provide your own error diffusion matrix in JSON format\n\nMore methods of dithering are being worked on, such as Riemersma, Yuliluoma, and blue noise. If you'd like to help out with development of those methods, or request a new one, please make an issue in my [dither](https://github.com/makeworld-the-better-one/dither) library repo, not this one.\n\n## Features\n- Set palette using RGB tuples, hex codes, number 0-255 (grayscale), or [SVG color names](https://www.w3.org/TR/SVG11/types.html#ColorKeywords)\n- Optionally recolor image with a different palette after dithering\n- Set dithering strength\n- Image is automatically converted to grayscale if palette is grayscale\n- Force image to grayscale with `--grayscale`\n- Change image saturation, brightness, or contrast before dithering\n- Read EXIF rotation tags by default (disabled with `--no-exif-rotation`)\n- Downscale image before dithering, keeping aspect ratio\n- Upscale image after dithering, without producing artifacts\n- Supports input image of types JPEG, GIF (static), PNG, BMP, TIFF \n- Output to PNG or GIF\n- Process multiple images with one command\n- Combine multiple images into an animated GIF\n- Uses all CPU cores when possible\n- Support images with transparency (alpha channel is kept the same)\n- Have the palette chosen for you based on colors in the image\n\n## Installation\n\n### Binary\n\nDownload a binary from the [releases](https://github.com/makeworld-the-better-one/didder/releases) page. On Unix-based systems you will have to make the file executable with `chmod +x \u003cfilename\u003e`. You can rename the file to just `didder` for easy access, and move it to `/usr/local/bin/`.\n\nOn Windows you will have to open a terminal or cmd window in the same directory as the EXE file, or [add it to your PATH](https://stackoverflow.com/a/41895179).\n\nMake sure to click \"Watch\" in the top right, then \"Custom\" \u003e \"Releases\" to get notified about new releases!\n\n### Homebrew\n\nIf you use [Homebrew](https://brew.sh/), you can install didder through the my personal tap.\n```\nbrew tap makew0rld/tap\nbrew install didder\n```\nYou can update it with:\n```\nbrew upgrade didder\n```\n\n\n### From source\n\n**Requirements**\n- Go 1.14 or later\n- GNU Make\n\nPlease note the Makefile does not intend to support Windows, and so there may be issues.\n\n```shell\ngit clone https://github.com/makeworld-the-better-one/didder\ncd didder\n# git checkout v1.2.3 # Optionally pin to a specific version instead of the latest commit\nmake # Might be gmake on macOS\nsudo make install # Install binary and man page\n```\n\nmacOS users can also use [Homebrew](https://brew.sh/) to install the latest commit of didder:\n\n```\nbrew tap makew0rld/tap\nbrew install --HEAD didder\n```\nYou can update it with:\n```\nbrew upgrade --fetch-HEAD didder\n```\n\n## Getting started\n\n```\ndidder [global options] command [command options] [arguments...]\n```\n\nThe best place to learn about how to use didder is the manual. Run `man didder`, or look at the [MANPAGE.md](./MANPAGE.md) file. If you only read about one flag, read about `--strength`. It's especially important for `bayer` dithering of color images.\n\nYou can also run `didder` to see the global options and commands. Each command represents a different dithering algorithm, or set of algorithms. You can see the options for each command with `didder help cmd` or `didder cmd --help`.\n\nHere's a fully working command as an example:\n```shell\ndidder --palette \"black white\" -i input.jpg -o test.png bayer 16x16\n```\nThis command dithers `input.jpg` to just use black and white (implicitly converting to grayscale first), using a 16x16 Bayer matrix. The result is written to `test.png`.\n\nAs another example, here's the command used for the image at the top of the README:\n```shell\ndidder -i david.png -o david_dithered.png --palette \"black white\" --recolor \"black F273FF\" --upscale 2 bayer 4x4\n```\n\nIf you'd like the replicate this yourself, the input image is available [here](https://upload.wikimedia.org/wikipedia/commons/7/71/Michelangelo%27s_David_-_63_grijswaarden.png).\n\n## What method should I use?\n\nGenerally, using Floyd-Steinberg serpentine dithering will produce results with the fewest artifacts. The command would be:\n\n```shell\ndidder [palette and I/O options] edm --serpentine FloydSteinberg\n```\n\nPlaying with the strength of the matrix might also be useful. The example above is at full strength, but sometimes that's too noisy. The command for 80% strength looks like this:\n\n```shell\ndidder --strength 80% [palette and I/O options] edm --serpentine FloydSteinberg\n```\n\nThe main reason for using any other dithering algorithm would be\n\n- **Aesthetics** - dithering can be a cool image effect, and different methods will produce different and stronger artifacts\n- **Speed** - error diffusion dithering is sequential and therefore single-threaded. But ordered dithering, like using `Bayer`, will use all available CPUs, which is much faster.\n\nIf you want to see examples of the different dithering algorithms, you can look at [this directory](https://github.com/makeworld-the-better-one/dither/tree/master/images/output). Or try them out yourself!\n\n\n## License\nThis project is licensed under the GPL v3.0. See the [LICENSE](./LICENSE) file for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmakew0rld%2Fdidder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmakew0rld%2Fdidder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmakew0rld%2Fdidder/lists"}