fail-proof png destruction ◆ filter types ◆ scanlines ◆ deflate ◆ crc is not your friend ◆ fail-proof png destruction ◆ filter types ◆ scanlines ◆ deflate ◆ crc is not your friend ◆
This page needs Ruby, and it is not installed on this machine.
The Docker image installs both at build time. Running uvicorn
directly does not, so install them once:
sudo apt install ruby-full
sudo gem install pnglitch
ruby -e "require 'pnglitch'; puts PNGlitch::VERSION" # should print a version
No sudo? Use gem install --user-install pnglitch and make sure
~/.local/share/gem/ruby/*/bin is on your PATH. Then restart the
server. Everything else on the site works without this.
1 · Load a PNG
DROP IMAGE HERE
or
SELECT FILE
PNGs pass through untouched — bit depth, palette and interlacing
are what make each one glitch differently. Other formats are converted
to PNG first. Max 12 MB.
Converted to PNG on upload.
2 · Pick a wrecking method
3 · Tune it
Same image, same settings, same seed gives the same output every time.
Re-roll bumps the seed and runs again.
A glitched PNG is a broken PNG on purpose. Browsers disagree about how
much damage they will render, so this pane may be blank or partial even
when the file is fine. The download above is always the real artifact.
5 · Run it
ruby that will run
HOW TO
Load a PNG. Other formats are converted first. Real PNGs are passed through byte-for-byte, because palette and bit depth change how the glitch looks.
Pick a method. Each button is a different way of damaging the image data. Substitute is what pnglitch's own command line does; Corrupt compressed is the most violent.
Then pick a filter type — this is the important one. PNG stores each row with a filter that predicts it from the row above or the pixel to the left. That means the filter type decides how far damage travels. With none a corrupted byte stays a speck. With up or paeth it smears down the rest of the image. The same operation looks completely different at each setting.
Seeds are real here. Unlike the pixelsort tools, the randomness is in the Ruby we generate, so the same seed always gives the same picture. Re-roll to bump it.
If the result pane is blank, the file is probably fine and your browser just refused it. Use the decode button underneath, and download the raw file regardless.
Try this: Chunk swap with filter none, then
the same thing with up. Same damage, one stays local and the
other paints the whole lower half.