Image sequences, love ’em. All those distributed renders and so on create hundreds of thousands of image files on my media drive, so it’s good to have a quick scrip for checking that a sequence has rendered completely without any gaps.
Here’s one in Powershell. It tells you if any files are not in sequence and reports on how many there are.
$i=0; #set to the first frame of your sequence ls .\ |%{ while (! ( $_.name -match ("{0}{1}" -f $i, $_.extension))){ write-host "missing frame $i" -ForegroundColor Red; $i += 1; }; echo $i; $i+=1; [Console]::SetCursorPosition($Host.UI.RawUI.CursorPosition.X, $Host.UI.RawUI.CursorPosition.Y-1) }; echo "last frame $i"
If your sequence doesn’t start at zero it will report the missing frames up to the start of your sequence. You can change that behaviour by setting $i to the first frame.
If you add it to your powershell config file you can add a couple of bells and whistles, including the ability to choose a folder and first frame:
function Check-ImageSequence{ Param ($searchFolder = ".\", [int]$StartFrame = 0) $i=$StartFrame; ls (get-item $searchFolder) |%{ while (! ( $_.name -match ("{0}{1}" -f $i, $_.extension))){ write-host "missing frame $i" -ForegroundColor Red; $i += 1; }; write-host "checking $i"; $i+=1; #wind back the cursor position so it doesn't scroll [Console]::SetCursorPosition($Host.UI.RawUI.CursorPosition.X, $Host.UI.RawUI.CursorPosition.Y-1); }; echo "last frame $i" }
The code prints out each missing file and counts how many images there are in the sequence.
I use pngs a lot, and there’s a useful tool called pngcheck that makes sure that the png file is ok – sometimes if I kill a render node mid-save I end up with half-completed frames, which cause headaches when I try to import them in post.
You can add pngcheck to the mix thus:
function Check-ImageSequence{ Param ($searchFolder = ".\", [int]$StartFrame = 0, [switch]$removeDodgyPngs ) $i=$StartFrame; ls (get-item $searchFolder) |%{ while (! ( $_.name -match ("{0}{1}" -f $i, $_.extension))){ write-host "missing frame $i" -ForegroundColor Red; $i += 1; }; echo "checking $i"; #wind back the cursor position so it doesn't scroll; [Console]::SetCursorPosition($Host.UI.RawUI.CursorPosition.X, $Host.UI.RawUI.CursorPosition.Y-1); if ($_.extension -eq ".png"){ #only check png files $badFile = ((pngcheck.exe $_.fullname 2>&1) -match "Error"); if ($badFile){ write-host "$_ is dodgy" -ForegroundColor Red; if ($removeDodgyPngs){ rm $_.fullname; } } } $i+=1; }; echo "last frame $i"; }
Note that by default this script won’t remove any dodgy ones. If you specify -RemoveDodgyPngs
then it will. That’s why it checks that the file actually is a png file, in case you accidentally run it on a folder full of jpegs.