Чи можна зменшити розмір файлу SVG, щоб він був ближче до його еквіваленту в форматі JPEG?

Як вже вказував 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, ви можете видалити всі невикористовувані атрибути простору імен XML з <svg>. Повинно бути безпечно видалити як мінімум xmlns: rdf, xmlns: dc, xmlns: cc, xmlns: inkscape і xmlns: sodipodi. Якщо є надлишкова атрибут xmlns: svg, видаліть його теж. Єдині атрибути простору імен, які ви повинні були залишити на даний момент:

    xmlns = "http://www.w3.org/2000/svg" xmlns: xlink = "http://www.w3.org/1999/xlink"
  • Тег <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 любить побічно визначати кругові градієнти, спочатку визначаючи зупинки в <linearGradient>, а потім посилаючись на них в <radialGradient>; Ви можете спростити це, перемістивши упори прямо всередину радіального градієнта і позбувшись від невикористаного лінійного градієнта. Як бонус, якщо, зробивши це, вам вдалося позбутися від усіх xlink: href, ви можете видалити атрибут xmlns: xlink з <svg>.

  • Якщо ви дійсно хочете вичавити кожен останній зайвий байт, знайдіть числові значення з дуже великою кількістю десяткових знаків і округлите їх до чогось більш розумного. Саме тут дійсно допомагає попередній перегляд в реальному часі, оскільки він дозволяє побачити, скільки ви можете округлити значення, перш ніж воно стане видимим. Навіть якщо ви не хочете ретельно перевіряти кожне число, щоб побачити, як його можна округлити, ви можете, принаймні, вибрати низько висять фрукти, наприклад, округливши значення 1.0000859 пікселів до 1.

  • Нарешті, очистіть відступи і прогалини в файлі. Щоб звести до мінімуму кількість байтів, вам потрібно помістити все в один рядок (або, принаймні, ставити тільки переноси рядків перед атрибутами, де в будь-якому випадку потрібно пробіл), але це дійсно важко прочитати. Проте, можна досягти пристойного балансу між Удобочитаемость і компактністю за допомогою деякого простого, консервативного відступу.

У будь-якому випадку, ось що мені вдалося відредагувати вручну в SVG-зображення:

<? xml version = "1.0&quot;?> <svg xmlns = "http://www.w3.org/2000/svg" version = "1.1" x = "0" y = "0" width = "124" height = " 52 "> <g transform =" translate (1, -27.5) "> <linearGradient id =" lg1 "x1 =" 70.1063 "y1 =" 13.4122 "x2 =" 66.1994 "y2 =" -26.4368 "gradientUnits =" userSpaceOnUse " gradientTransform = "matrix (0.9997, -0.0263,0.0263,0.9997, -7.4,61.3)"> <stop offset = "0" stop-color = "# 154BBF" /> <stop offset = "1" stop-color = " # 6E8BFF "/> </ linearGradient> <path d =" M 119.198,75.836 C 115.115,80.541 7.902,78.843 3.585,74.366 -0.734,69.888 -1.322,46.938 2.76,42.233 6.842,37.53 113.821,30.047 118.137,34.524 c 4.319 , 4.477 5.143,36.609 1.061,41.312 z "id =" path3298 "fill =" url (# lg1) "/> <linearGradient id =" lg2 "x1 =" 70.4391 "y1 =" 13.5887 "x2 =" 70.4391 "y2 = "-25.3265" gradientUnits = "userSpaceOnUse" gradientTransform = "matrix (0.9997, -0.0263,0.0263,0.9997, -7.4,61.3)"> <stop offset = "0" stop-color = "# 4166FA" /> <stop offset = "1" stop-color = "# 87A4FF" /> </ linearGradient> < path d = "M 119.2,71.843 C 115.247,76.118 11.615,74.749 7.447,70.692 3.281,66.635 2.747,45.804 6.7,41.528 c 3.953, -4.277 107.372, -11.239 111.539, -7.183 4.167,4.057 4.915,33.222 0.961,37.498 z "id =" path3305 "fill =" url (# lg2) "/> <path stroke =" #fff "stroke-width =" 5 "d =" m 103.734,64.225 0,0 c -0.921, -0.271 -1.661 , -0.724 -2.2, -1.342 -0.917, -1.051 -0.957, -2.455 -0.88, -3.576 -1.831, -0.373 -3.866, -0.886 -7.099, -1.84 -3.233, -0.954 -5.221, -1.627 -6.961 , -2.308 -0.544,0.983 -1.34,2.14 -2.679,2.525 -0.789,0.227 -1.656,0.204 -2.577, -0.068 -1.415, -0.417 -2.876, -1.431 -3.723, -2.583 -1.731, -2.354 -1.283 , -6.55 -0.601, -9.655 0.964, -4.399 3.692, -11.662 7.252, -13.641 3.374, -1.877 12.426,0.468 16.37,1.6315 3.944,1.1635 12.873,4.1185 14.692,7.5355 1.914,3.596 0.262,11.176 -1.317,15.393 - 1.113,2.978 -3.016,6.746 -5.746,7.782 -1.338,0.505 -3.117,0.564 -4.531,0.146 z "/> <path fill =" # 4888fa "d =" m 103.734,64.225 0,0 c -0.921, - 0.271 -1.661, -0.724 -2.2, -1.342 -0.917, -1.051 -0.957, -2.455 -0.88, -3.576 -1.831, -0.373 -3.866, -0.886 -7.099, -1.84 -3.233, -0.954 -5.221, -1.627 -6.961, -2.308 -0.544,0.983 -1.34,2.14 -2.679,2.525 -0.789,0.227 -1.656,0.204 -2.577, -0.068 -1.415, -0.417 -2.876, -1.431 -3.723, -2.583 -1.731, -2.354 -1.283, -6.55 -0.601, -9.655 0.964, -4.399 3.692, -11.662 7.252, -13.641 3.374, - 1.877 12.426,0.468 16.37,1.6315 3.944,1.1635 12.873,4.1185 14.692,7.5355 1.914,3.596 0.262,11.176 -1.317,15.393 -1.113,2.978 -3.016,6.746 -5.746,7.782 -1.338,0.505 -3.117,0.564 -4.531,0.146 z "/> <path fill =" # 87b5ff "d =" m 114.774,40.292 c -1.17, -2.151 -7.571, -4.939 -14.293, -6.921 V 33.37 c -0.023, -0.007 -0.047, -0.014 -0.07 , -0.021 -0.023, -0.007 -0.047, -0.015 -0.071, -0.02 l 0,0 c -6.723, -1.985 -13.612, -3.12 -15.761, -1.949 -4.296,2.337 -9.198,17.315 -6.265,21.228 0.907,1.209 3.014,2.449 4.466,2.043 1.452, -0.404 2.121, -3.4 2.652, -3.174 2.518,1.077 5.601,2.117 8.744,3 3.119,0.966 6.272,1.765 8.972,2.229 0.569,0.097 -0.498,2.975 0.502,4.104 1.001 , 1.128 3.443,1.232 4.861,0.709 4.586, -1.693 8.602, -16.933 6.263, -21.227 z "/> <path fill =" # 2f67c9 "d =" m 90.818,42.604 c -0.097, -0.194 -0.901, -0.575 -1.999, -1.006 0.317, -1.135 0.497, -2.007 0.401, - 2.2 -0.319, -0.641 -3.681, -1.766 -4.323, -1.447 -0.192,0.096 -0.574,0.9 -1.004,1.998 -1.135, -0.315 -2.006, -0.497 -2.201, -0.401 -0.64,0.319 -1.766, 3.681 -1.446,4.322 0.096,0.193 0.901,0.575 1.997,1.006 -0.316,1.134 -0.496,2.007 -0.4,2.199 0.32,0.64 3.682,1.767 4.323,1.447 0.193, -0.095 0.575, -0.901 1.005, -1.997 1.135,0.314 2.008,0.496 2.199,0.401 0.642, -0.32 1.767, -3.682 1.448, -4.322 z "/> <path fill =" # 4888fa "d =" m 100.282,33.311 c -0.024, -0.007 -0.046, -0.013 -0.069 , -0.02 -0.023, -0.006 -0.046, -0.013 -0.07, -0.02 l 0,0 c -2.455, -0.725 -4.932, -1.334 -7.181, -1.755 -0.765,2.073 -1.164,4.497 -0.789,5.91 0.627,2.363 9.764,5.059 11.574,3.414 1.096, -0.996 2.091, -3.297 2.566, -5.483 -1.876, -0.731 -3.937, -1.428 -6.031, -2.046 l 0,0 z "/> <circle fill =" # 639bff "r =" 3.427 "cy =" 46.947 "cx =" 101.382 "/> <circle fill =" # 4888fa "r =" 2.868 "cy =" 45.940 "cx = "109.28" /> <circle fill = "# 2f67c9" r = "2.868" cy = "52.538" cx = "106.287" /> <radialGradient id = "rg3" cx = "90.874" cy = "39.29" fx = "90.874" fy = "39.29" r = "19.89" gradientUnits = "userSpaceOnUse" gradientTransform = "matrix (1.7028, -0.3387,0.276,1.3872, -70.22,16.58)"> <stop stop-color = "# 1166a8" stop -opacity = "0" offset = "0" /> <stop stop-color = "# 1166a8" stop-opacity = "0.02" offset = "0.45" /> <stop stop-color = "# 1166a8" stop-opacity = "0.63" offset = "1" /> </ radialGradient> <path d = "m 103.734,64.225 0,0 c -0.921, -0.271 -1.661, -0.724 -2.2, -1.342 -0.917, -1.051 -0.957 , -2.455 -0.88, -3.576 -1.831, -0.373 -3.866, -0.886 -5.973, -1.508 -0.375, -0.11 -0.75, -0.223 -1.124, -0.338 -0.378, -0.107 -0.753, -0.216 -1.128 , -0.326 -2.107, -0.622 -4.095, -1.295 -5.835, -1.976 -0.544,0.983 -1.34,2.14 -2.679,2.525 -0.789,0.227 -1.656,0.204 -2.577, -0.068 -1.415, -0.417 -2.876 , -1.431 -3.723, -2.583 -1.731, -2.354 -1.283, -6.55 -0.601, -9.655 0.964, -4.399 3.692, -11.662 7.252, -13.641 3.374, -1.877 12.4 26,0.468 16.245,1.591 l 0.274,0.081 c 3.795,1.123 12.724,4.078 14.543,7.495 1.914,3.596 0.262,11.176 -1.317,15.393 -1.113,2.978 -3.016,6.746 -5.746,7.782 -1.338,0.505 -3.117,0.564 -4.531,0.146 z "fill =" url (# rg3) "/> </ g> </ svg>

Це SVG-зображення виглядає практично не відрізнятись від другого прикладу, наведеного вище, і займає всього 5189 байт, що значно менше, ніж ваше зображення JPEG. Я впевнений, що він ще може бути оптимізований, але це всього лише приклад того, що ви можете зробити за кілька хвилин на практиці. (Мені знадобилося набагато більше часу, щоб набрати цю відповідь, ніж насправді редагувати код SVG.)

Нарешті, стиснення цього SVG-коду за допомогою gzip скорочує його до 1846 байт (!), Що становить трохи більше чверті розміру вашої версії JPEG.

Quot;?