Printing arbitrary photos with a “Kid’s” thermal camera
I bought a kid’s camera with a thermal printer (specifically the GREENKINDER Kids Camera Instant Print 3.0" Screen, Girls & Boys Age 3-12 | 3 Rolls Print Paper,1080P Kids Digital Camera,Christmas Birthday Gifts for Children 3 4 5 6 7 8 9 10 11 12 Years Old,Green - who doesn’t love Amazon item titles?) as part of a very cute project with my wife to create a book of a photo a day for 2026, with the aid of adhesive thermal printing rolls. I am, however, terrible at 1) remembering to take the camera with me and 2) remembering to take a photo with this camera over whatever I may have on my person at any given time. In a bid to adhere to the spirit of the project, if not the literal word, I needed a way to print photos taken anywhere using the thermal printer on the camera.
Having plugged the camera into a computer via USB, I found a number of JPG images in a folder, named PICT001.JPG, PICT002.JPG, PICT003.JPG et cetera, sequentially. Initially and naively, I attempted to copy of 60.3 megapixel image from a Leica M11 directly to the camera and have it print it: this was not a success. I assumed that the camera may be a little resource constrained when dealing with such large images, and I turned to ffmpeg to try to create a version of my image that the camera would happily view and print.
After a little fiddling, this is what I ended up with:
ffmpeg -i "[ORIGINAL_IMAGE.JPG]" \
-vf "transpose=1:passthrough=landscape,crop=iw:iw*(9/16),scale='trunc(if(gt(iw*ih,8000000),sqrt(8000000*(iw/ih)),iw)/16)*16':-16,format=yuvj420p,setsar=1/1" \
-q:v 7 -map_metadata -1 -update 1 [PICTXXX.JPG]
So what are we doing here with the argument to -vf (video filters, in ffmpeg parlance)?
transpose=1:passthrough=landscape: we rotate the image 90 degrees clockwise if it is not already in the landscape orientation (determined by the width of the image being greater than the height - no EXIF magic here)crop=iw:iw*(9/16): the camera natively takes (and prints) images in a 16:9 aspect ratio. We do a crop from the middle of the image to make it fit thatscale='trunc(if(gt(iw*ih,8000000),sqrt(8000000*(iw/ih)),iw)/16)*16':-16: we resize the image with respect to its aspect ratio such that it ends up being around 8MP in size. We make sure that the width is a whole number of pixels (with the power oftrunc) that is a multiple of sixteen - I found that the camera wouldn’t read some images if the height or width wasn’t a multiple of sixteen. I cannot make this make sense. We then scale the ‘other’ side with-16so that we have a height that is also a multiple of sixteen.format=yuvj420p,setsar=1/1: we make sure that we have a ’normal’ colour format in the image withformatand that we have square pixels withsetsar
The value of -q:v can be tuned to ensure that we have images that are under ~1MB in file size: the camera tends not to like images larger than that. -map_metadata -1 will strip metadata from the image (just in case the camera didn’t like it) and -update 1 ensures that we only write a single, static file. The output filename should be incremental from the highest numbered image currently on the camera.
With these conditions met, we can copy the images back to the camera, open the ‘album’ feature and freely print our photos.
Would buying a separate thermal printer have been easier? Yes, but it also would have cost me £40 and I would be even further away from the spirit of the undertaking.