Вырезаем растровую графику из СВГ
Столкнулся с задачей.
Есть фотография большого размера (более 4 тыс. пикселей по ширине), на которой запечатлены части живых организмов.

Организмы — это паразиты. Мизерные примитивные червячки из класса Моногеней, живущие на жабрах рыб. К жабрам они крепятся при помощи крючков.

Разные виды червячков внешне очень похожи. Они отличаются только формой прикрепительных крючков. У каждого таксономического рода уникальная форма крючков, но среди видов одного рода различия форм не столь очевидны. Чтобы их обнаружить, надо использовать методы морфометрического анализа.

Для выполнения морфометрического анализа мы оцифровываем форму крючков. Загружаем фотографию в Инскейп, обводим кривыми и сохраняем результат в СВГ.

Проблема в том, что готовый файл слишком много «весит». Исходный джипег размером 800 Кб, после обводки и сохранения в СВГ, толстеет до 12 Мб. В результате мне присылают мегатонные свгешки с внедренной графикой, которые надо разместить на сервере, а он не резиновый.
Я не могу выбросить фото и загрузить на сервер только векторные кривые. Потому что контуры обрисовывают несколько человек, у каждого свои особенности рисования, они ошибаются, и результаты надо перепроверять. А фотография помогает проверить правильность построения контуров.
Я несколько часов пытался уменьшить размер свг-файла с графикой без потери качества. Попробовал уменьшить в Инскейпе, не получилось — размеры фотографии и свг-файла остались огромными. Потом разобрался с форматом и нашел решение.
Формат СВГ поддерживает два способа хранения изображений.
Первый, когда графический файл внедрен в СВГ. Это не оптимальный способ, потому что файл не сжат. Изображение состоит из последовательности символов в позиционной системе счисления с основанием 64 (base64). Отсюда 800 Кб превращаются в 12 Мб.

Второй, когда СВГ хранит ссылку на внешний графический файл. Тогда СВГ содержит только описание кривых, а фотография хранится отдельно. Размер свг-файла становится маленьким.

Второй вариант подошел.
Если бы файлов было мало, я бы все переконвертировал вручную. Но файлов много — несколько сотен.
В результате написал скрипт на ПХП. Он извлекает из СВГ фотографию, сохраняет ее в виде отдельного джипега и вставляет в СВГ ссылку на этот джипег. Джипег хранится локально и называется так же, как и свг-файл.
Скрипт умный. Если в разных файлах используется одна и та же фотография, скрипт сохранит ее всего один раз и во всех файлах будет правильно на нее ссылаться. Это экономит место.
Эта заметка описывает этап создания виртуальной коллекции паразитов рыб Мирового океана