Ir al contenido

Imágenes y SVGs

Hay dos formas principales de renderizar imágenes en Manim:

  • ImageMobject: Renderiza imágenes en los formatos habituales (jpg, jpeg y png).
  • SVGMobject: Un SVG es un Scalable Vector Graphics, es decir, utiliza el mismo lenguaje vectorial de puntos y curvas que los VMobjects y, por tanto, puede tratarse como tal.

Una imagen como un jpg o un png puede describirse (simplificando mucho) como una cuadrícula de píxeles, que a su vez puede trasladarse al código como una matriz compuesta por arrays de 3 o 4 dimensiones: rojo, verde, azul y alfa para la opacidad.

Por ello, Manim puede leer imagenes desde el disco y renderizarlas con apenas unas pocas líneas de código. Para ello le indicamos una ruta y Manim usa Pillow para cargar la imagen:

image_example.py
from manim import *
from pathlib import Path
class ImageExample(Scene):
def construct(self):
image_example = ImageMobject(Path("assets") / "python_example_logo.jpeg")
self.add(image_example)

Ah, pero como al final las imágenes son matrices de píxeles, podemos usar numpy para definir una imagen. Nosotros le definimos colores en filas y columnas e interpola donde sea necesario:

image_from_array_example.py
from manim import *
class ImageFromArray(Scene):
def construct(self):
image = ImageMobject(np.uint8([
[[255, 0, 0], [0, 255, 0]], # First row: Red and Green
[[0, 0, 255], [255, 255, 0]] # Second row: Blue and Yellow
]))
image.height = 7
self.add(image)

De forma similar, podemos usar archivos SVG en Manim mediante la clase SVGMobject. Internamente, Manim los trata como si fueran un VMobject, a diferencia de ImageMobject que es tratado como un Mobject.

svg_example.py
from manim import *
from pathlib import Path
class SVGExample(Scene):
def construct(self):
svg_example = SVGMobject(Path("assets") / "logo-vertical-alt-color-dark.svg").scale(3)
self.add(svg_example)

Crea una función para que puedas renderizar una imagen a partir de una url.

Solución al ejercicio 1
image_ex.py
from urllib import request
from io import BytesIO
from PIL import Image
from manim import *
def image_from_url(url: str) -> ImageMobject:
with request.urlopen(url) as response:
img_data = response.read()
pil_image = Image.open(BytesIO(img_data))
return ImageMobject(pil_image)
class ImageExercise(Scene):
def construct(self):
url = "https://pablogsal.com/_astro/pablo-dither-160.-XZlNx32_LQsIA.png"
img = image_from_url(url)
img.scale(5)
self.add(img)

Crea una función para que puedas renderizar un SVG una a partir de una url.

Solución al ejercicio 2
svg_ex.py
import urllib.request
from pathlib import Path
from manim import *
def svg_from_url(url: str, **kwargs) -> SVGMobject:
filename = Path.cwd() / url.split("/")[-1]
if not filename.suffix == ".svg":
filename = filename.with_suffix(".svg")
urllib.request.urlretrieve(url, filename)
return SVGMobject(str(filename), **kwargs)
class SVGExercise(Scene):
def construct(self):
url = "https://2026.es.pycon.org/images/logo-vertical-alt-color-dark.svg"
svg = svg_from_url(url, color=RED)
svg.scale(2)
self.add(svg)