{"id":1055,"date":"2021-05-23T21:50:38","date_gmt":"2021-05-23T21:50:38","guid":{"rendered":"https:\/\/www.ishygddt.xyz\/~blog\/?p=1055"},"modified":"2022-03-08T19:48:13","modified_gmt":"2022-03-08T19:48:13","slug":"python-converting-svg-to-ico","status":"publish","type":"post","link":"http:\/\/www.ishygddt.xyz\/~blog\/2021\/05\/python-converting-svg-to-ico","title":{"rendered":"Converting SVG to .ico with Python"},"content":{"rendered":"<p>Just a super rudimentary script that I made which hooks <a href=\"https:\/\/cairosvg.org\/\">CairoSVG<\/a> up to <a href=\"https:\/\/python-pillow.org\/\">Pillow<\/a> because apparently Firefox <a href=\"https:\/\/github.com\/JamesTheAwesomeDude\/cerdicator\/issues\/22\">doesn't support<\/a> SVG-formatted <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Mozilla\/Add-ons\/WebExtensions\/API\/browserAction\"><code class=\"language-javascript\" data-line=\"\">browserAction<\/code><\/a> images:<\/p>\n<pre><code class=\"language-python\" data-line=\"\">import cairosvg.surface\nfrom PIL import Image\nfrom io import BytesIO\nimport sys\n\n\ndef main(input=sys.stdin.buffer, output=sys.stdout.buffer):\n\tsvg2ico(url=input, write_to=output)\n\n\ndef svg2ico(*args, resolutions={96, 48, 32, 24, 16}, write_to=None, **kwargs):\n\tt = cairosvg.surface.Tree(*args, **kwargs)\n\tims = []\n\tfor res in resolutions:\n\t\tcairosvg.surface.PNGSurface(t, f:=BytesIO(), res * 2,\n\t\t  output_width=res, output_height=res).finish()\n\t\tims.append(Image.open(f))\n\tim = ims.pop(0)\n\t# Fix for Windows XP and MATE Desktop:\n\t# add bitmap_format=&quot;bmp&quot; to the following command\n\t# - requires Pillow&gt;=8.3.0\n\t# - makes the resulting image files larger\n\t# * https:\/\/github.com\/python-pillow\/Pillow\/issues\/2512\n\t# * https:\/\/github.com\/mate-desktop\/eom\/issues\/310\n\tim.save(f:=write_to or BytesIO(), format=&#039;ICO&#039;,\n\t  append_images=ims, sizes=[im.size for im in ims])\n\tif not write_to:\n\t\treturn f.get_value()\n\n\nif __name__ == &#039;__main__&#039;:\n\tsys.exit(main(*sys.argv[1:]))<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Just a super rudimentary script that I made which hooks CairoSVG up to Pillow because apparently Firefox doesn't support SVG-formatted browserAction images<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[97],"tags":[68,69,44],"class_list":["post-1055","post","type-post","status-publish","format-standard","hentry","category-original-content","tag-data","tag-filetype-conversion","tag-python"],"_links":{"self":[{"href":"http:\/\/www.ishygddt.xyz\/~blog\/wp-json\/wp\/v2\/posts\/1055","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.ishygddt.xyz\/~blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.ishygddt.xyz\/~blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.ishygddt.xyz\/~blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.ishygddt.xyz\/~blog\/wp-json\/wp\/v2\/comments?post=1055"}],"version-history":[{"count":23,"href":"http:\/\/www.ishygddt.xyz\/~blog\/wp-json\/wp\/v2\/posts\/1055\/revisions"}],"predecessor-version":[{"id":2076,"href":"http:\/\/www.ishygddt.xyz\/~blog\/wp-json\/wp\/v2\/posts\/1055\/revisions\/2076"}],"wp:attachment":[{"href":"http:\/\/www.ishygddt.xyz\/~blog\/wp-json\/wp\/v2\/media?parent=1055"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.ishygddt.xyz\/~blog\/wp-json\/wp\/v2\/categories?post=1055"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.ishygddt.xyz\/~blog\/wp-json\/wp\/v2\/tags?post=1055"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}