Подозреваю, что в момент исполнения скрипта изображение еще не загружено.
Попробуйте повесить код на событие load у картинки:
а). либо указав прямо у элемента
onload="makeWatermark()"
,
б). либо с помощью
$('img').on('load', makeWatermark)
, но в таком случае SRC нужно указывать только после того как повесите обработчик события.
в). (имхо — лучший вариант) Вообще не грузите в DOM изображения, грузите только ссылку на изображение, а на стороне JS уже создавайте изображение и работайте с ним:
var img = document.createElement('img');
img.onload = makeWatermark;
img.src = "<?=$img_url;?>";
А для стабильной работы еще и неплохо бы убедиться в том, что вотермарк тоже загружен, и если нет — то загрузить его (аналогичным способом загрузить и вызвать onload с дальнейшей отрисовкой).
Надеюсь мой совет помог. Успехов! :)