У меня есть изображение, которое я использую на веб-сайте. Я хотел бы использовать SVG, чтобы он мог быть любого размера и при этом выглядеть свежим.
- Этот выпадающий список содержит файл SVG, а также оригинальный файл Illustrator.
Это экспорт JPEG:
SVG имеет гораздо больший размер файла, чем JPG. Можно ли оптимизировать SVG так, чтобы он имел одинаковый размер файла? Я мог бы потерять часть качества, если бы это помогло. Я попробовал этот оптимизатор SVG , но это не имело большого значения.
Если я сохраню файл иллюстратора в формате JPG, отследю результат и сохраню его в формате SVG, то получу файл гораздо меньшего размера, но с некоторой потерей качества. Это заставляет меня думать, что, возможно, слои в оригинале вызывают большой размер? Является ли изображение, с которым я работаю, слишком сложным, чтобы подходить для SVG?
Ответы:
Ваш SVG содержит встроенную пиксельную графику для тени в правом нижнем углу контроллера. Это составляет около четверти размера файла. Если вы удалите его, ваш SVG-файл будет соответствовать вашему JPEG. Вы можете, вероятно, достичь адекватно подобного эффекта с градиентом.
Другие методы уменьшения размера файла SVG включают в себя:
Если вы не используете абсурдно много слоев (подумайте об одном слое для каждого объекта), слои не должны вносить существенный вклад в размер файла, и даже в этом случае это будет только дробная часть.
Если вы можете разумно создать изображение с нуля, оно не должно быть слишком сложным для формата SVG. Не существует такой вещи, как порог магической сложности, после которого размеры файлов увеличиваются (вероятно, это справедливо для любого неопределенно разумного формата). Конечно, если вы выбираете только достаточно грубое разрешение, вы можете экспортировать каждый SVG в JPEG с меньшим размером файла. Но это не обязательно означает, что вы не должны использовать SVG.
¹ Это, в частности, без отслеживания и тому подобное. В качестве крайнего примера: если вы хотите точно воспроизвести каждый пиксель фотографии с помощью примитивов SVG (т. Е. Без встраивания пиксельной графики в SVG), вы действительно можете считать результат слишком сложным для его эффективного представления в формате SVG. , Но это, надеюсь, здравый смысл.
источник
Как уже указывал Wrzlprmft, более 50% размера файла SVG определяется встроенным растровым изображением PNG, используемым для создания довольно тонкого эффекта затенения на контроллере. Достаточно просто избавиться от этого изображения и заменить его простым радиальным градиентом, чтобы сжать SVG примерно до 10 КБ.
Исходное изображение с причудливой растровой штриховкой слева, отредактированная версия с простым радиальным градиентом справа.
Пока вы занимаетесь этим, вы должны также проверить свои пути, чтобы увидеть, есть ли что-то, что можно упростить там. Я не нашел много, но контур вашего контроллера имеет несколько смежных узлов (около верхней и нижней середины), которые могут быть объединены без какой-либо видимой разницы.
Это экономия 50%, но давайте пока не останавливаться. Если вы хоть немного знаете о формате SVG , вы можете сделать это намного лучше.
Сначала запустите «Vacuum Defs» в Inkscape, чтобы избавиться от ненужных определений, а затем сохраните изображение как «обычный SVG». Теперь пришло время открыть его в текстовом редакторе и посмотреть, от чего мы можем избавиться. В идеале вам следует использовать редактор со встроенным предварительным просмотром SVG, чтобы вы могли быстро увидеть, как ваши изменения (надеюсь, ни одного) влияют на внешний вид изображения. Я использую для этого emacs , но есть и другие редакторы с похожими функциями .
В любом случае, когда файл SVG открыт в вашем текстовом редакторе, давайте начнем его упрощать!
Прямо наверху есть большой бесполезный
<!-- comment -->
. Просто удали это.Если вы редактируете SVG прямо из Illustrator, есть также бесполезная
<!DOCTYPE ... >
строка. Удалите это тоже.Inkscape настаивает на вставке ненужного блока метаданных RDF в ваше изображение. Просто найдите
<metadata ...>
тег и удалите его вместе со всем, вплоть до закрытия</metadata>
.Кроме того, даже если вы сохраните файл как «обычный SVG», Inkscape все равно засорит его множеством пользовательских атрибутов. Найдите каждый атрибут, который начинается с
inkscape:
или,sodipodi:
и удалите их.После удаления метаданных и атрибутов, специфичных для Inkscape, вы можете удалить из
<svg>
тега все неиспользуемые атрибуты пространства имен XML . Она должна быть безопасной для удаления , по меньшей мереxmlns:rdf
,xmlns:dc
,xmlns:cc
,xmlns:inkscape
иxmlns:sodipodi
. Если есть избыточныйxmlns:svg
атрибут, удалите его тоже. Единственные атрибуты пространства имен, которые вы должны были оставить на данный момент:У
<svg>
тега также есть множество других бесполезных атрибутов, которые вы можете безопасно удалить, например,enable-background
иxml:space="preserve"
. (Те , которые вставляются экспортером Illustrator SVG, и Inkscape не достаточно умен , чтобы понять , что они бесполезны) . ВviewBox
атрибуте может также быть безопасно удален из этого образа, так как он просто повторяет значенияx
,y
,width
иheight
атрибуты.Вы также можете безопасно удалить
encoding
иstandalone
атрибуты из<?xml ... ?>
тега.Теперь давайте разберемся с данными изображения. По какой-то причине Inkscape настаивает на присвоении
id
атрибутов каждому элементу, даже если на них никогда не ссылаются. Любойid
атрибут, значение которого никогда не повторяется в другом месте файла (ищите его!), Можно безопасно удалить. По сути, единственные идентификаторы, которые вам нужно сохранить, это идентификаторы для градиентов и, возможно, для любых других объектов (например, путей), найденных внутри<defs>
секций.Кроме того, Inkscape любит генерировать длинные идентификаторы, как
linearGradient4277
. Рассмотрите возможность сокращения любых идентификаторов, которые вы не можете просто удалить во что-то короткое, напримерlg1
.Есть также несколько
<defs>
разделов сразу после друг друга. Слияние их экономит несколько байтов (и упрощает структуру документа в целом).Есть также несколько пустых групп (
<g>
элементов) в конце файла. Просто избавься от них. Также может быть несколько последовательных групп с одинаковымtransform
атрибутом (или вообще без них); это также безопасно объединить их.По какой-то странной причине Inkscape сохраняет избыточный путь Безье (
d
атрибут) для<circle>
элементов. Это занимает место без всякой причины, поэтому просто удалите их. (Оставьтеd
атрибуты для<path>
элементов быть; они фактически используются для чего-то.)Inkscape также любит использовать CSS в
style
атрибутах, где более конкретные атрибуты будут короче, например, переписатьfill="#4888fa"
в более подробныйstyle="fill:#4888fa"
. Вы можете сэкономить несколько байтов, разбив эти стили на отдельные атрибуты (и удалив те, которые просто бесполезно повторяют настройку по умолчанию), но которые немного больше знакомы с форматом SVG, чем большинство изменений, описанных выше.Кроме того, если есть какие-либо
<use ... >
элементы, вы можете сохранить несколько байтов, заменив их фактическим элементом, на который они ссылаются. (Конечно, это экономит место только в том случае, если связанные элементы используются только один раз.) Также кажется, что Inkscape любит косвенно определять круговые градиенты, сначала определяя остановки в a<linearGradient>
, а затем ссылаясь на них в a<radialGradient>
; Вы можете упростить это, переместив упоры прямо внутрь радиального градиента и избавившись от неиспользуемого линейного градиента. В качестве бонуса, если, сделав это, вам удалось избавиться от всехxlink:href
атрибутов, вы можете удалитьxmlns:xlink
атрибут из<svg>
тега.Если вы действительно хотите выжать каждый последний лишний байт, найдите числовые значения со слишком большим количеством десятичных знаков и округлите их до чего-то более разумного. Здесь действительно помогает предварительный просмотр в реальном времени, поскольку он позволяет увидеть, сколько вы можете округлить значение, прежде чем оно станет видимым. Даже если вы не хотите тщательно проверять каждое число, чтобы увидеть, насколько оно может быть округлено, вы можете по крайней мере выбрать низко висящий фрукт, например, округлив значение
1.0000859
пикселей до простого1
.Наконец, очистите отступы и пробелы в файле. Чтобы свести к минимуму количество байтов, вам нужно поместить все в одну строку (или, по крайней мере, ставить только переносы строк перед атрибутами, где в любом случае требуется пробел), но это действительно трудно прочитать. Тем не менее, можно достичь приличного баланса между удобочитаемостью и компактностью с помощью некоторого простого консервативного отступа.
В любом случае, вот что мне удалось отредактировать вручную в SVG-изображение:
Это SVG-изображение выглядит практически неотличимым от второго примера, приведенного выше, и занимает всего 5189 байт, что значительно меньше, чем ваше изображение JPEG. Я уверен, что он еще может быть оптимизирован, но это всего лишь пример того, что вы можете сделать за несколько минут на практике. (Мне понадобилось гораздо больше времени, чтобы набрать этот ответ, чем на самом деле редактировать код SVG.)
Наконец, сжатие этого SVG-кода с помощью gzip сокращает его до 1846 байт (!), Чуть больше четверти размера вашей версии JPEG.
источник
Я немного удивлен, что никто не упомянул расширение " Scour ". Он поставляется с Inkscape (начиная с версии 0.47) и выполняет многие из оптимизаций, упомянутых Илмари Кароненом.
источник
Вы можете преобразовать его в сжатый SVG (SVGZ) и поместить image.svgz на свою веб-страницу:
Или, в Adobe Illustrator, просто сохраните как «SVG сжатый», который запишет файл image.svgz.
Для вашего тестового изображения он все еще больше, чем JPG:
источник
Недавно я нашел инструмент по адресу https://petercollingridge.appspot.com/svg-editor ( исходный код ), который помогает оптимизировать файлы SVG. В этом случае он дает хорошие результаты, уменьшая размер файла до 3,7 КБ, что составляет чуть более половины размера JPG, с небольшой ручной настройкой:
Использование этого инструмента для оптимизации файлов SVG требует значительно меньше времени, чем игра в гольф вручную.
источник
SVGOMG! удивительное веб-приложение для оптимизации SVG
По словам создателя приложения, SVGOMG является " M Minging G UI" SVGO .
Запуск его на предоставленном изображении сводит его к простому
3.42kb
и сразу1.4kb
после распаковки.источник
<radialGradient>
и<path>
из моего оптимизированного вручную кода, SVGOMG оптимизирует полученное изображение размером 5,8 кБ до 4,02 кБ (4,11 кБ предварительно), и, кажется, выполняет довольно тщательную работу; Я действительно не вижу очевидных упущенных возможностей. (Играя с этим немного больше, я заметил, что иногда не удается объединить последовательные группы с одинаковыми атрибутами; иногда кажется, что Inkscape генерирует их, например, при корректировке страницы, чтобы соответствовать чертежу.)