Ці можна паменшыць памер файла 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;?