Я создаю веб-приложение с использованием asp.net-core с угловыми 4 шаблонами и использую svg-edit, чтобы позволить пользователю рисовать / загружать / сохранять изображения на мобильных устройствах, особенно на устройствах IOS / устройствах Android.Svg-edit хорошо работает для того, что мне нужно, но я столкнулся с проблемой на устройствах IOS, касающейся генерации / преобразования пользовательского чертежа (svg) в другой формат (png base64), который будет POST для API как частьпроцесс сохранения.
Я использую следующий код, который использует HTML-холст для преобразования svg в png base64
svg-editor.js
editor.getDrawingPngBase64 = function (svgString) {
if (!$('#export_canvas').length) {
$('<canvas>', { id: 'export_canvas' }).hide().appendTo('body');
}
var canvas = $('#export_canvas')[0];
canvas.width = $("#svgcanvas").width(); // svgCanvas.contentW;
canvas.height = $("#svgcanvas").height(); // svgCanvas.contentH;
var ctx = canvas.getContext("2d");
var promise = new Promise(function (resolve, reject) {
function drawInlineSVG(ctx, rawSVG, callback) {
var svg = new Blob([rawSVG], { type: "image/svg+xml;charset=utf-8" }),
domURL = self.URL || self.webkitURL || self,
url = domURL.createObjectURL(svg),
img = new Image;
img.onload = function () {
ctx.drawImage(this, 0, 0);
var base64 = canvas.toDataURL("image/png");
resolve(base64);
};
img.src = url;
}
drawInlineSVG(ctx, svgString);
});
return promise;
}
Однако,иногда это работает только на устройстве IOS с использованием браузера Chrome или Safari.Метод onload просто не вызывается.Я предполагаю, что изображение SVG может быть слишком большим для его преобразования.
Я также пробовал этот метод, который также не работает надежно ....
editor.getDrawingPngBase64 = function (svgString) {
if (!$('#export_canvas').length) {
$('<canvas>', { id: 'export_canvas' }).hide().appendTo('body');
}
var canvas = $('#export_canvas')[0];
canvas.width = svgCanvas.contentW;
canvas.height = svgCanvas.contentH;
var ctx = canvas.getContext("2d");
var promise = new Promise(function (resolve, reject) {
function webkitNamespaceBugWorkaround(pText) {
var lText = pText.replace(/\ xlink=/g, " xmlns:xlink=", "g");
lText = lText.replace(/\ href=/g, " xlink:href=", "g");
return lText;
}
canvg(canvas, webkitNamespaceBugWorkaround(svgString), {
renderCallback: function () {
var base64 = canvas.toDataURL("image/png");
resolve(base64);
}
});
});
return promise;
}
Я также пробовал библиотеку canvg, и она также не работает надежно *
Этот метод вызывается angular4 component.ts
public save() {
const svgString: String = svgEditor.getSvgString();
(<any>window).svgEditor.getDrawingPngBase64(svgString).then(pngBase64: string) => {
// Call api and save the image
}
}
Причина, по которой я конвертирую svg в png на стороне клиента, заключается в том, что я не могу установить библиотеку рендеринга C # SVG в решении dotnet-core(https://www.nuget.org/packages/Svg/)
Пожалуйста, помогите!