fix(gallery): Apply Media Source watermark in ImageService - #730
Conversation
|
Проверил на dev (PHP 8.3, драйвер GD, Intervention Image 3.11.7),
Возвращаю из-за одного артефакта на GD. GD: серые плашки вокруг знака на прозрачном исходникеПри Как проверял: исходник 400×300 с прозрачным фоном и синим товаром в центре, логотип 120×40 с прозрачным фоном,
Пример из документации — как раз Как обойти в
Для Imagick поведение Intervention корректное, там достаточно не переиспользовать объект (как сейчас) или применить прозрачность один раз тем же способом. В тест стоит добавить сравнение пикселей на прозрачном исходнике: сейчас тесты сравнивают байты превью целиком, и такой артефакт они не ловят. Позиции из phpThumbPR берёт из phpThumb/miniShop2 только Стоит решить в этом PR одним из двух способов:
В обоих случаях неизвестное значение |
|
@biz87 Спасибо за ревью — учёл в d363963. GD + прозрачный исходник: opacity печётся в альфа-канал водяного знака один раз, Позиции: карта phpThumb Тесты: прозрачный исходник + полупрозрачный знак с clear-половиной; |
|
@biz87 По позициям взяли второй вариант: наследие phpThumb/MS2 убрано.
Коммит: |
Docs describe watermark in thumbnails JSON, but makeThumbnail ignored the key after the phpThumb → Intervention migration. Place the overlay after resize, log missing/invalid paths, and keep generation succeeding.
Intelephense expected Intervention\Image\Interfaces\EncoderInterface; the @return pointed at a non-existent Encoders\EncoderInterface.
Match wmi alignment *: cover the canvas with repeated marks. offset_x/offset_y act as inter-tile margins; alias tile accepted.
Imagick PlaceModifier divides alpha on the same object each call when opacity is below 100, so only the first tile stayed visible. Pass the file path into every place() and assert a far-corner pixel differs.
GD place() with opacity < 100 used imagecopymerge and painted opaque boxes on transparent sources; bake alpha once and place at 100. Map phpThumb TL…BR codes, log unknown positions, reuse one mark for tiles.
Accept only Intervention place names and tile; reject *, BR, and other wmi codes with an error log. Align PR/docs wording with MS3 thumbnails.
72a30e5 to
2f65eec
Compare
Описание
В документации галереи описан блок
watermarkв JSON свойстваthumbnailsMedia Source, но после перехода на Intervention ImageImageService::makeThumbnail()этот ключ не читал. Превью пересоздавались без водяного знака и без записей вerror.log.Теперь overlay накладывается через
place()после resize:enabled,path,position,offset_x,offset_y,opacity. Путь резолвится относительно корня сайта (в т.ч. URL-style/assets/...). Файл вне базы или отсутствующий путь пишутся в error.log, превью всё равно создаётся.position— только имена Intervention (top-left…bottom-right) илиtile(мозаика по кадру; тогдаoffset_x/offset_y— отступы между плитками). Коды phpThumb/MS2 (*,BR,C, …) не принимаются: пишутся в error.log, overlay не ставится. Opacity < 100 печётся в альфа-канал знака (корректный alpha на GD). Effects из docs (sharpen/blur/greyscale/progressive/strip_exif) в этот PR не входят.Тип изменений
Связанные Issues
Closes #729
Как это было протестировано?
composer ci:php/composer test,npm run lint:ci,composer stan/ GitHub Actions CI)Конфигурация тестирования:
fix/issue-729-thumbnail-watermarkотbetaСкриншоты (если применимо)
не приложено
Чеклист
composer stan/ CI jobPHPStan)npm run lint:ciдля Vue)Дополнительные заметки
Пример тайлинга:
Документация на docs.modx.pro должна описывать те же значения
position(Intervention +tile), без*/ wmi-кодов.