Разобрался. Это проще, чем кажется. Вот
рабочий скрипт.
Описываю работу:
1. Создаю маску. Используя функцию imagefilledpolygon рисую красный полигон на чистом холсте.
2. Копирую каждый пиксель с исходной картинки, добавляя прозрачность в зависимости от яркости красного цвета на холсте маски. Красный - непрозрачный, белый - прозрачный.
[3. Вырезаю полученное изображение на отдельный холст, чтобы избавиться от пустых краев картинки]