Перевод изображения из svg в png. Конвертация картинок из растра в вектор

В одном из проектов возле меню выводились небольшие иконки в формате svg, и нужно, чтобы при наведении курсора на пункт меню, текст и иконка меняли цвет. Для того чтобы не плодить большое количество картинок, было решено перевести svg в код и использовать в стилях CSS.

Краткая инструкция как использовать SVG в CSS

полученный код используем в своем css файле.

Например, берем иконку Facebook (стандартная иконка с небольшим изменением).

На сайте https://jakearchibald.github.io/svgomg/ жмем “Open SVG” или просто перетягиваем иконку на область просмотра. В левом верхнем углу жмем “CODE” , выделяем код, а затем жмем на иконку копировать , так мы получим в буфер код нашей свг-картинки.

Примерно такой:

Затем полученный код вставляем в окно выше, жмем Converte и получаем готовый background-image :

Background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"%3e%3cpath fill-rule="evenodd" clip-rule="evenodd" fill="%23FFF" d="M12.748 16v-1h6v1h-6zm0-3h6v1h-6v-1zm4 5h-4v-1h4v1zM13.748 9.975v-3h-4v-1c0-1.104.896-2 2-2h2v-2.95h-2c-2.8.256-5 2.583-5 5.45 0 .017.005.032.005.05h-.005v.45h-3v3h3v8h3v-8h4z"/%3e%3c/svg%3e");

Копируем и используем его в своем css.

Чтобы изменить цвет, меняем fill="%23FFF" , только учитываем, что %23 – это обычный знак # , то есть fill="%23000" – это обычный черный (#000).

Иногда появляется необходимость сохранить svg в png средствами браузера. К сожалению, браузер не имеет волшебного api, который позволил бы это сделать без различных хаков. Что же делать, если все таки хочется добиться желаемого?

Первая идея, которая мне пришла в голову, сделать это через canvas, который имеет метод toDataURL("image/png");
Итак, я написал простенький скрипт: jsfiddle , github :

Var html = document.querySelector("svg").parentNode.innerHTML; var imgsrc = "data:image/svg+xml;base64," + btoa(html); var canvas = document.querySelector("canvas"), context = canvas.getContext("2d"); canvas.setAttribute("width", 526); canvas.setAttribute("height", 233); var image = new Image; image.src = imgsrc; image.onload = function () { context.drawImage(image, 0, 0); var canvasdata = canvas.toDataURL("image/png"); var a = document.createElement("a"); a.textContent = "save"; a.download = "export_" + Date.now() + ".png"; a.href = canvasdata; document.body.appendChild(a); canvas.parentNode.removeChild(canvas); };

Суть скрипта проста: я преобразовывал svg в dataUri, загружал его через image, рисовал картинку на canvas и превращал в png. Казалось, цель достигнута, и можно расслабится. Этот подход сработал в Firefox и Chrome, но открыв во всеми нами любимом браузере IE, я получил замечательную ошибку:

Дело в том, что IE считает, что картинка загружена с другого хоста. К сожалению, установить origin для dataUri не получится. Собственно, описание правил можно найти здесь: https://html.spec.whatwg.org/multipage/scripting.html#security-with-canvas-elements . Можно было, конечно, проксировать svg через сервер, и тогда все бы сработало, но хотелось чисто клиентское решение.

И тут я вспомнил про замечательную библиотеку canvg . С помощью этой библиотеки я рисую svg на canvas, а далее поступаю как в первом варианте: беру toDataURL("image/png") . Получился такой незамысловатый код: github :

Var svg = document.querySelector("svg"); var canvas = document.createElement("canvas"); canvas.height = svg.getAttribute("height"); canvas.width = svg.getAttribute("width"); canvg(canvas, svg.parentNode.innerHTML.trim()); var dataURL = canvas.toDataURL("image/png"); var data = atob(dataURL.substring("data:image/png;base64,".length)), asArray = new Uint8Array(data.length); for (var i = 0, len = data.length; i < len; ++i) { asArray[i] = data.charCodeAt(i); } var blob = new Blob(, {type: "image/png"}); saveAs(blob, "export_" + Date.now() + ".png");

Тут стоит сказать, что еще я использовал библиотеку FileSaver для вызова диалогового окна сохранения.
Вот и все, мы добились желаемого результата.

Стоит отметить один нюанс - я задался вопросом сохранения svg в png, когда писал плагин для экспорта tauCharts . Так как стили в svg задаются из внешнего файла, чтобы добиться максимально подобия с исходным svg, я вставляю inline style в svg. И получаем вот такой результат .

Надеюсь, статья окажется полезной для вас и сохранит ваше время.

SVG image is a major vector format for the next generation of websites, and it’s fully integrated with the new standards of HTML5. With Aurora SVG Viewer & Converter: You can easily View SVG graphics and Convert your productions to multiple formats.

The advent of HTML5 has brought greater usage of SVG-formatted vector images. If you’re a web developer, now’s the perfect time to get ahead of the game and outfit your workflow with everything that you need to work with HTML5 and SVG images. The first step is to grab a copy of today’s discounted software promotion, , available for Mac and Windows users!

Aurora SVG Viewer & Converter makes it easy to organize, view, and convert SVG images. With Aurora SVG Viewer & Converter , you’ll enjoy a convenient thumbnail display mode, and an instantly recognizable folder view. If you need to convert an SVG image to a different format, Aurora SVG Viewer & Converter saves the day by enabling you to save images as TIFF, PNG, JPB, BMP, GIF, TGA, XPM, PPM, XBM, or even PDF format files. Even better, you can convert multiple files in batch!

Of course, you always have full control over the details with Aurora SVG Viewer & Converter . Adjust output resolution, convert portions of SVG images, and set conversion quality!

Windows Screenshot: Mac Screenshot:

Aurora SVG Viewer & Converter Features:

1. Support Windows & MAC OS.

2. Easy folder selection and thumbnail display mode.

3. Quickly preview SVG pictures or convert them; supports SVG and SVGZ .

4. SVG converter to multiple image formats include: tiff, png, jpg, bmp, gif, tga, xpm, ppm, xbm, and pdf .

5. Batch Convert , make a list of images to convert, and then in one sweep convert them and save them to another folder.

6. Output resolution is easily set with the free zoom resolution. Select and convert any area of the SVG canvas.

7. Custom convert any area you choose: select an area of the SVG image and convert .

Loading...Loading...