Resize Images with Tasker

Motivated by the change in Google Photos that stopped offering “free storage” I worked on a script that would resize images on my Android phone and released the first version in November 2022. The script requires Tasker to run.

The Arc de Triomphe in France photographed on my phone.

There were a couple of problems with it, however. I wasn’t entirely happy with the workflow.

  • Images were deleted from DCIM/Camera immediately (and moved elsewhere), making it impossible to review the image I just photographed in the camera gallery.
  • When I opened the gallery app separately, the resized images wouldn’t show until some time later, or not at all. I verified the files were there using a file manager. Android’s media system just didn’t know about them.

I put up with these downsides for quite a while, occasionally researching how to fix the disappearing image problem, but I couldn’t find any good answer until last month.

A leprechaun dances on the street.

I found out that Tasker must run the “Media Scan” command when it creates a new image file. The documentation says you can give it a directory, but that didn’t work for me. When I gave it the filename of the newly created image, it all worked! The image appeared in my gallery apps immediately!

Next up was the problem with deleted images. Originally, I moved the files into a “work in progress” directory to easily work on them, but if I left them in DCIM/Camera, I could check if a file of the same name existed in DCIM/Resized/. If it didn’t, then it’s time for a new file!

That did leave the problem that files were left in DCIM/Camera. Some of which might have been resized, some not. (It happens if I burst mode photos, where the task starts and works while new files are being created. It doesn’t catch the very new files). I created a new task “Photo Backup” that simply runs the resize task, and then runs the shell command “mv” to move all the Jpg files to where Lightroom will see them on my computer. I added that task to my launcher with an icon. I tap that when I get home and within a few minutes, the files are synced to my computer, using Syncthing.

A horse in a field

To better track changes, I’ve uploaded the task to GitHub in this Resize Images task for Tasker repository. All development happens on my phone, and I’ll publish it to Taskernet first, but then changes will be copied there.

To install the task, go to the Taskernet page for it on your phone and click on Import. You can also manually import the .xml file if you like. How you use the task is up to you, but I created a profile that uses the “File Modified” event, and gave it “DCIM/Camera” as the File. The action to fire is the “Resize Jpeg Files And Leave Originals” task listed here.

Save space by resizing Google Photos

On the 1st of June 2021, Google Photos stopped offering free storage.

Google Photos is a fantastic service, but at the rate I take photos I knew I’d fill the remaining gigabytes of storage in a matter of months, so I stopped uploading photos from my phone.

I don’t regard Google Photos as a backup system for my photos. I use Backblaze for that, where everything is backed up from my desktop computer. Google Photos is very useful for sharing albums, the face recognition is amazing, and utilities like HDR photo generation and time lapses are nice bonuses.

In Lightroom, I would resize images to 16MP before uploading them to Google Photos. Those files are still huge compared to what you really need. They are likely only going to be seen on a screen, either phone or laptop. So recently I started to resize them to 1280 pixels on the longest side. Instead of a 6,000Kb file, I now upload a 600Kb file. On my phone screen it looks much the same, and I have the original on my computer anyway!

What I really wanted is for my phone to resize the images I shoot and then allow Google Photos to upload them. It would have to do something like this:

  1. Check the DCIM/Camera directory for new photos, and move them to a work directory.
  2. Go through those images, resize them and copy the location EXIF data from the original images.
  3. Save the resized images to a new directory in DCIM where Google Photos will back them up.
  4. Some time later, those resized images should be deleted when we’re sure they’ve been backed up.

With the help of Tasker, an Android app, I was able to do that, and more. Tasker is a tool that lets you automate tasks on your phone. It can do simple things like enable screen rotation when Google Photos or Lightroom are launched. Or it can disable your Wi-Fi if you leave the house.

First, the bad news. The Tasker app costs money, and it’s complicated to use. However, it’s not expensive and there are lots of public Tasker projects on their Taskernet website, which means you probably won’t need to delve into the complexity of it. Much.

Over the course of a few weeks I figured out how to program Tasker to do what I wanted, and if you look at my Taskernet Profile you’ll see the result of that work. The final work on copying the EXIF data took me three hours on the train back from Dublin, and then a hint on Reddit to complete.

The Resize Images for Google Photos Tasker profile does exactly what it says. It moves new photos out of the way, resizes them, and copies the location data to the new files. The original files are moved to Download/jpeg. Finally, it saves the resized images back in a DCIM directory, where Google Photos will find them and upload them.

Every time a photo is taken, it checks if any existing resized photo is more than 7 days old and deletes it, which should be more than enough time for it to be uploaded to Google Photos.

It also moves MP4 files out of the way to Download/jpeg because MP4 files can be huge! You could resize those with Handbrake on your desktop machine before uploading to Google Photos.

Tasker task source code

You install it through Tasker itself or by loading this blog post on your phone. Tap on this Resize Images for Google Photos link, which will bring you to Taskernet. You can also find it by searching for the tags, Files and Camera.

Read the description, and please make a backup of your photos first. Tap Import and Tasker will load. A warning about the commands used now shows.

It does execute Java code, but that’s only to copy the EXIF data to the resized images. It uses shell commands to move files around or delete thumbnails and old files.

When it asks for the profile, just tap on Base, if you don’t have any others. If you are worried about running unknown code on your phone, don’t enable it. Take a look at the “Resize Jpeg Files” task. You can see all 39 lines of code.

Some notes on implementation:

  • The profile monitors the DCIM/Camera directory for new files. If your favourite camera app puts photos somewhere else, they won’t be found.
  • Some paths are hard coded. The ExifInterface library requires a filename. It expects that the Resized directory is in /storage/emulated/0/DCIM/. If it isn’t there, edit line 25. Three shell commands run at the end and use /sdcard/DCIM/. That should be edited too if necessary.
  • Photos are moved to Download/WIP to be resized.
  • After resizing, they are saved to DCIM/Resized.
  • Photos are resized to a maximum width of 1280px, so portrait orientation images will be bigger.
  • Your gallery app will show the resized images as duplicates unless you can hide the Resized directory.
  • The gallery in your camera app is going to show broken images. Your favourite gallery app may not even show the images. I find the Piktures app regenerates the thumbnails properly, but the Samsung and Xiaomi gallery apps don’t. Neither does Google Photos, so if anyone knows how to fix that, I’m all ears!

This might seem like a lot of trouble to save some space in my Google account, but this is something Google could have done themselves. Sure, they have the storage saver setting. That resizes large photos down to 16MP but, even saved in WebP format or something, the files are fairly big. It was an itch I had to fix. Besides all that, Tasker is a very powerful tool that I wanted to use more!

My photos don’t stay on my phone. I use Syncthing to synchronise a few different directories with my desktop machine. Every few days I import them into Lightroom. Importing them moves them, and being removed from the Camera directory is synchronised back to the phone, so the photos are deleted from the phone. From Lightroom they’re backed up in various ways. I actually run a small shell script to move photos taken by various apps into one directory, and check if duplicate DNG/Jpeg files exist, but that’s a topic for another blog post.

Move DNG files when the Android camera exits

Many Android phones can shoot RAW photos now but some of them will record a Jpeg file at the same time. This didn’t bother me until Google Photos started backing up DNG files, but it would back up the Jpeg files too so I ended up with duplicate images. I created a FolderSync shortcut to move the DNG files out of the DCIM/Camera/ directory but of course half the time I’d forget and duplicates would end up on Google.

I bought Tasker a few weeks ago when it was finally on sale, but only used it for one task, to auto rotate the Maps application, but then this morning I realised I could use it to fix up my DNG files!

So, here’s the task I created with much help from various forum threads, especially this one. I added it as an exit task for the Samsung Camera app which at least ensures I won’t need to remember to move files around any more. It would be handy to fire it every time a photo was taken but this is a good start.

Move DNG Files
A1: List Files [ Dir:DCIM/Camera Match:*.dng Include Hidden Files:Off Use Root:Off Sort Select:Alphabetic Variable:%Filestomove ]
A2: For [ Variable:%Files Items:%Filestomove() ]
A3: Move [ From:%Files To:dng Use Root:Off ]
A4: End For

I did try adding a flash notification if %Filestomove was set but it never worked and I don’t know why. If any Tasker experts want to chime in I’d love to hear how to get that working!