Почему мой SVG корректно отображается в веб-программах просмотра, но не в pydiffvg, даже если атрибуты обводки отсутствуPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Почему мой SVG корректно отображается в веб-программах просмотра, но не в pydiffvg, даже если атрибуты обводки отсутству

Сообщение Anonymous »

Я пытаюсь визуализировать SVG с помощью pydiffvg, но это не удается или визуализируется неправильно (структура в порядке, но цвет очень неправильный, отсутствуют элементы), когда в SVG отсутствуют определенные атрибуты обводки, такие как ширина штриха. Тот же SVG прекрасно отображается в веб-браузерах или таких инструментах, как Inkscape, которые, похоже, «угадывают» или используют значения по умолчанию для этих недостающих атрибутов.
Вот что я пробовал:
  • Назначение значений обводки по умолчанию (черный или прозрачный) в моем анализаторе.
  • Установка ширины обводки равна 1,0, если она не определена.
  • Установка ширины обводки равна 1,0, если она не определена.
    ли>
Несмотря на эти попытки, pydiffvg по-прежнему не справляется, в то время как браузеры справляются с этим без особых усилий. Что именно браузеры делают по-другому при обработке неполных SVG и как я могу воспроизвести это поведение, чтобы гарантировать, что pydiffvg правильно отображает SVG?
Вот SVG, который я использую: Вот как должен выглядеть SVG:
Изображение
А вот как выглядит рендеринг (не обращайте внимания на ориентацию, которую я изменил):
Изображение

Вот мой блок кода рендеринга:

Код: Выделить всё

if shape_type == "custom"  and svg_path:
try:
_, _, parsed_shapes, parsed_shape_groups = svg_to_scene(svg_path)

# Filter out invalid shapes
parsed_shapes = [
shape for shape in parsed_shapes
if hasattr(shape, "points") or hasattr(shape, "center")
]

print(f"Parsed {len(parsed_shapes)} valid shapes from {svg_path}.")

if not parsed_shapes:
print(f"Warning: No valid shapes were parsed from {svg_path}.")
continue

scale_factor = shape_info.get("size", min(self.canvas_width, self.canvas_height) * 0.01)

# Process each logical group based on count
for g in range(count):
group_shapes = []
for i, (shape, shape_group) in enumerate(zip(parsed_shapes, parsed_shape_groups)):
if hasattr(shape, "points"):
shape.points = shape.points.to(self.device) * scale_factor
shape.initial_points = shape.points.clone()
elif hasattr(shape, "center"):
shape.center = shape.center.to(self.device) * scale_factor
shape.initial_points = shape.center.unsqueeze(0).clone()

# Set default colors if missing
shape_group.fill_color = (
shape_group.fill_color.clone().to(self.device)
if shape_group.fill_color is not None
else torch.tensor([1.0, 1.0, 1.0, 1.0], device=self.device)
)
shape_group.stroke_color = (
shape_group.stroke_color.clone().to(self.device)
if shape_group.stroke_color is not None
else shape_group.fill_color.clone().to(self.device) # Default to fill color
)

if isinstance(shape, pydiffvg.Path):
new_shape = self.copy_path(shape)
elif isinstance(shape, pydiffvg.Polygon):
new_shape = pydiffvg.Polygon(
points=shape.points.clone(),
is_closed=shape.is_closed,
)
elif isinstance(shape, pydiffvg.Circle):
new_shape = pydiffvg.Circle(
radius=shape.radius.clone(),
center=shape.center.clone(),
)
else:
print(f"Warning:  Unsupported shape type {type(shape)}.")
continue

new_shape.initial_points = shape.initial_points.clone()
group_shapes.append(new_shape)
self.shapes.append(new_shape)

new_shape_group = pydiffvg.ShapeGroup(
shape_ids=torch.tensor([len(self.shapes) - 1], dtype=torch.int32).to(self.device),
fill_color=shape_group.fill_color,
stroke_color=shape_group.stroke_color,
)
self.shape_groups.append(new_shape_group)

self.shapes_by_logical_group.append(group_shapes)

# Initialize position and orientation
position = torch.tensor(
[
center_x + (torch.rand(1).item() - 0.5) * 2 * max_radius,
center_y + (torch.rand(1).item() - 0.5) * 2 * max_radius,
],
requires_grad=True,
device=self.device,
)
orientation = torch.tensor(
[torch.rand(1).item() * 360],
requires_grad=True,
device=self.device,
)

# Apply transformations to group shapes
for shape in group_shapes:
if hasattr(shape, "initial_points"):
angle = torch.deg2rad(orientation[0])
rotation_matrix = torch.tensor([
[torch.cos(angle), -torch.sin(angle)],
[torch.sin(angle), torch.cos(angle)]
]).to(self.device)

transformed_points = torch.matmul(shape.initial_points, rotation_matrix.T) + position
shape.points = transformed_points.clone()
elif isinstance(shape, pydiffvg.Circle):
shape.center = position.clone()

self.parameters.position.append(position)
self.parameters.orientation.append(orientation)

logical_group_count += 1

except Exception as e:
print(f"Error processing custom SVG {svg_path}: {e}")
continue
Будем признательны за любую информацию о том, как предварительно обрабатывать или анализировать такие SVG!

Подробнее здесь: https://stackoverflow.com/questions/793 ... en-when-st
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»