Я бы сделал это в ImageMagick, выполнив вычисления, чтобы изменить ваши координаты, чтобы они были в центре относительно изображения смайлика. Таким образом, вы можете использовать-гравитационный центр. Таким образом, когда изображение смайлика меняет размер, позиция его размещения не изменяется.
Большое изображение:
![enter image description here](https://i.stack.imgur.com/gOnCN.jpg)
Смайлик:
![enter image description here](https://i.stack.imgur.com/3EF1B.png)
Предположим, что вы получаете верхние левые относительные координаты xul, yul для размещения смайлика на большом изображении. Затем мы хотим вычислить центр изображения смайлика относительно этих координат. Как только мы получим это, координаты относительно центра большого изображения будут такими, за вычетом половины размеров большого изображения. (+ Repage обеспечивает удаление любого виртуального холста из PNG-изображения смайлика. У JPG нет виртуального холста)
xul=255
yul=175
xc=`convert smiley.png +repage -format "%[fx:$xul + w/2]\n" info:`
yc=`convert smiley.png +repage -format "%[fx:$yul + h/2]\n" info:`
offx=`convert actor.jpg -format "%[fx:$xc-w/2]\n" info:`
offy=`convert actor.jpg -format "%[fx:$yc-h/2]\n" info:`
convert actor.jpg smiley.png +repage -gravity center -geometry +${offx}+${offy} -compose over -composite result1.jpg
![enter image description here](https://i.stack.imgur.com/mo44x.jpg)
Теперь, если мы удвоим размер изображения смайлика до 300x300, нам больше не нужно компенсировать это, потому что offx, offy по-прежнему являются центральными относительно центров, а центры не меняются при увеличении смайлика.
convert actor.jpg smiley.png +repage -gravity center -geometry 300x300+${offx}+${offy} -compose over -composite result2.jpg
![enter image description here](https://i.stack.imgur.com/pGP6V.jpg)