Да, срабатывает только раз, если сравнений больше одного, утечки продолжаются, но если "обнуление" массива делать в процедурах
Код:
//ScreenShot
...
SetLength(buf1,1,1);
SetLength(buffer, img.Height, img.Width);
...
и
Код:
//ReadIMG
...
SetLength(buf2,1,1);
SetLength(buffer, img.Height, img.Width);
...
то это вроде поможет и ошибок не возникнет (не должно)