A nice property of Netpbm is that you can pretty much dump raw image data into an Emacs buffer and have it rendered directly: https://nullprogram.com/blog/2012/09/14
I like this because it reduces friction and the difficult of getting started. Makes it easier to maintain enthusiasm and focus on the art bit.
I like the P6 format very slightly more: write()ing a whole array of bytes just fits my brain better than a loop over pixels with prints in it.
ImageMagick can consume all of these so it’s often super easy to slap system("magick convert out.pbm out.png"); on the end of a program.
system("magick convert out.pbm out.png");