Создание изображения из svg не работает

Я пытался создать изображение (используя класс window.Image) из DataURL. Этот DataURL содержит тег svg и сторонний объект. Но он просто остается совершенно пустым. Я также пытался нарисовать это изображение на холсте, но я не думаю, что это проблема, поскольку я даже не могу получить правильно выглядящее изображение.

Готовые данныеURL

data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22200%22%20height%3D%22200%22%3E%3CforeignObject%20width%3D%22100%25%22%20height%3D%22100%25%22%3E%3Cdiv%20style%3D%22background-color%3Ared%22%3Etest%3C%2Fdiv%3E%3C%2FforeignObject%3E%3C%2Fsvg%3E

Шаблонный тег SVG

ПРИМЕЧАНИЕ. Компонент ReactJS (<Component />) преобразуется в строку. Но он не содержит никаких стилей, это просто простой div с текстом внутри.

const svg = `<svg xmlns = "http://www.w3.org/2000/svg" width = "200" height = "200"><foreignObject width = "100%" height = "100%">${renderToStaticMarkup(
        <Component />
    )}</foreignObject></svg>`;

Шаблон DataURL

const url = `data:image/svg+xml;charset=utf8,${encodeURIComponent(svg)}`;

Загрузка изображения

const image = new window.Image(url);
image.src = url;

Изображение на холст

const ctx = canvas.getContext("2d");
const image = await loadImage(url) // a simple wrapper function which waits for the image to load that returns a promise
ctx.drawImage(image, 0, 0);
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
151
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если вы откроете готовый URL-адрес, вы увидите, что нет объекта с красным фоном, я думаю, потому что элемент div не отображается или даже не присутствует.

Попробуйте установить для атрибута xmlns в элементе div значение http://www.w3.org/1999/xhtml, например:

data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22200%22%20height%3D%22200%22%3E%3CforeignObject%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20x%3D%220%22%20y%3D%220%22%20width%3D%22200%22%20height%3D%22200%22%3E%0A%3Cdiv%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%20style%3D%22background-color%3A%20red%22%3Etest%3C%2Fdiv%3E%0A%20%20%20%20%3C%2FforeignObject%3E%3C%2Fsvg%3E

пример:

<svg xmlns = "http://www.w3.org/2000/svg" width = "200" height = "200">
    <foreignObject x = "0" y = "0" width = "200" height = "200">
        <div xmlns = "http://www.w3.org/1999/xhtml" style = "background-color: red">test</div>
    </foreignObject>
</svg>

Ссылка:

ForeignObject: https://developer.mozilla.org/en-US/docs/Web/SVG/Element/foreignObject

Я столкнулся с похожей проблемой, работая над своим приложением для дыхательных упражнений. Логотип моего приложения должен был отображаться на главной странице и не появлялся, когда я пытался его добавить. Вот что я сделал, чтобы исправить это.

Попробуйте добавить файлы .svg в качестве модуля в ваш файл react-app-env.d.

просто добавьте следующую строку в список файлов там,

declare module '*.svg'

Затем импортируйте файл, как обычно,

import imageName from './filePath'

Вы должны иметь возможность использовать svg внутри тега img и не иметь проблем.

Другие вопросы по теме