Skip to content

Comment on Show HN: Embed your source code in PNG files

Comments

I thought that this is what PICO-8 cartridge files (.p8.png) did; but it turns out that those use steganography within the image pixmap itself, rather than taking advantage of ancillary PNG chunks. Kind of a strange choice, honestly.

On a separate note, a fun fact: PNG uses what is basically a de-facto v3 of the https://en.m.wikipedia.org/wiki/Interchange_File_Format . PNGs can be parsed and generated with generic IFF tools. (Which can also be used to operate on AIFF, TIFF, and—perhaps surprisingly—Erlang .beam files.)

IFF is, IMHO, an incredibly underutilized “metaformat” for how simple it is to work with, how observable/inspectable the results are (for a binary file format), and yet how efficient it is (compared to text-based formats.)

PNG’s (backward-compatible) extensions over IFF are all pretty great ideas as well — e.g. using chunk name capitalization as metadata to mark chunks as optional (plus a few other things); linking chunks with checksums to indicate when derived chunks need to be recalculated; etc. If these extensions were promoted to features of the metaformat itself, that’d make probably the best document-oriented container metaformat around, beating e.g. “a zip file with a META-INF dir inside” by a wide margin. Sadly, AFAIK, nobody has tried to write a formal IFFv3 RFC to formalize these extensions. (Maybe something I’ll do one day myself.)

Wow, I never knew that about PICO-8. Very strange choice indeed given how much easier they could have done it.

I remember downloading a lot of albums off 4chan where you would save the image, then rename it to .zip to get a folder of MP3s. Good times!

I do wonder though how "stable" embedding files is. Like do most major hosting services process images to the point it strips that stuff out?

I do wonder though how "stable" embedding files is.

I was surprised to see this was still working 3 years later:

  $ curl -s https://pbs.twimg.com/media/Dq2sPGNU0AEKyyC.jpg | dd status=none bs=1 skip=599 count=40| sh
From https://news.ycombinator.com/item?id=18347985

It’s not that strange if you consider that you use image files to transfer images. Trying to store data outside of that (in a custom chunk) isn’t a use case anyone is accommodating so it will get stripped even by accident.

So if you use stego and store data in the image, you have a bigger chance of preserving the data.

Depends on whether you're expecting people to treat the files as "images" that happen to contain other data, and so e.g. upload them to photo-sharing sites, imageboards, etc.; or whether you're expecting people to treat the files as "programs" that happen to render with a thumbnail by default on most Operating Systems.

Personally, I don't see a PICO-8 .p8.png cartridge as an "image" any more than a Fireworks project file is an "image." It's a document that wraps itself in an image container to enable the 'document' to be previewed. It just so happens that you're able to very carefully treat the document as "an image" in some contexts (e.g. if you put it up on your own web server, and then embed the resulting URL in a webpage, people who right-click "Save As..." the 'image' will get the original document.) But this isn't really the goal (since you could do that just as well by generating an ancillary "cover art" file to go with the cartridge, and linking to the cartridge file using the cover art file.) The goal of such embeddings is just to make your document visually "self-describing" when examined with regular OS tools.

Of course, if you're considering designing your own PNG-embedded document format, and sharing the document losslessly via imageboards, photo-sharing sites, etc. is explicitly the goal of your format choice of PNG; then yes, steganography is the way to go.

But, well... if you are going to go the "embed the data in the pixmap" route — why not go all the way? Skip steganography (which will survive re-containerization, but won't survive the slightest lossy re-encoding), and instead just generate a "cover art" image containing a QR code that embeds the document data. Then the document would even survive digital-analogue-digital conversion!

(For the PICO-8 case, if the .p8.png files were simply art containing QR codes that the software could read directly, then a PICO-8 mobile app could support importing cartridges using the camera. Then people could just stick their carts up as posters at indie game conferences, or give them out as business cards.)

AboutSource Built by g1lg1l

Hackerly is an independent reader for Hacker News, built on the public HN API. Not affiliated with Y Combinator.