Renderizar SVG a ráster de 16 bits/canal

Tengo un SVG con degradados. El posprocesamiento con GIMP 2.8 produjo bandas debido a su rasterización, que es de solo 8 bits por canal. Descargué Gimp 2.10, luego configuré la precisión del canal en 16 bits, lo importé directamente desde Inkscape como SVG, pero las bandas estaban allí como antes. Luego instalé Inkscape 1.0.1, exportado como PNG de 16 bits, importado a Gimp 2.10. Gimp muestra 16 bits/canal, pero las bandas siguen ahí.

¿Existe alguna herramienta de conversión accesible que cree una verdadera imagen ráster de 16 bits/canal a partir de SVG, incluidos los degradados? Preferiblemente para Ubuntu.

EDITO: adjunto un ejemplo. En lugar de Color Curves, ahora uso otro filtro de color, porque es más fácil saber cómo se parametrizó. Aunque el efecto es similar.

En primer lugar, uso Inkscape 1.0.1 para exportar https://svgshare.com/s/TQe como PNG RGB16 a Gimp 2.10. Luego uso el filtro Brillo/contraste, donde cambio el contraste a 0.4. El efecto:

ingrese la descripción de la imagen aquí

Algunos de los valores posteriores del componente rojo, probados con el selector de color: 33.9, 38.9, 41.3, escala 0...100. Como se ve, la precisión no es ni siquiera de 8 bits.

Respuestas (3)

En realidad, el cairo no representa los gradientes a una profundidad de 16 bits por canal. Hay un tema abierto al respecto. Ver:

Ahora, como esto sigue siendo solo una especulación, eché un vistazo a la fuente de El Cairo. Sí, este es el caso. También resultados verificados en mathematica y photoshop.

Entonces, todo lo que obtiene es una imagen de 8 bits en un contenedor de imágenes de 16 bits. No hay solución para Inkscape, no hay solución para Adobe Illustrator, la última vez que verifiqué ninguna solución para Corel, intente con Affinity Designer. Es poco probable que alguno de los renderizadores comunes lo haga porque svg es un renderizador de pantalla por diseño. Escriba su propio renderizador o use una aplicación 3D para renderizar el svg. Dado que las splines de color son bastante comunes en las aplicaciones 3D, puede usar blender o maya para renderizar esto. Ambas aplicaciones también son aceptables si tiene formas, pero no todas las funciones SVG realmente esotéricas.

El histograma de su imagen se ve así:

ingrese la descripción de la imagen aquí

El histograma del SVG cargado directamente en Gimp o cargado en Inkscape, y exportado a PNG y cargado en Gimp son similares. Las características importantes son los huecos y los picos. Cuando estira el contraste (y para obtener la imagen que muestra arriba de su SVG, aumenta mucho el contraste ), en realidad está ampliando las brechas:

ingrese la descripción de la imagen aquí

y los saltos repentinos en el valor crean bandas.

Si convierte a 16 bits en Gimp, todavía tiene espacios, por lo que su aumento en el contraste aún crea bandas (porque la precisión adicional no llenará los espacios (*)).

ingrese la descripción de la imagen aquí

Lo que puede hacer en el modo de 16 bits (o incluso en 8 bits) es agregar una pequeña cantidad de ruido HSV para llenar los espacios (puede verificar el Histograma en tiempo real mientras juega en el diálogo de ruido HSV, para agregar el menor ruido posible (principalmente tono/saturación) para nivelar el histograma):

ingrese la descripción de la imagen aquí

Luego, presionar el contraste no produce bandas (pero, por supuesto, hace que el ruido agregado sea más visible).

ingrese la descripción de la imagen aquí

El método también funciona de alguna manera en 8 bits, pero estirar el contraste como lo hace eventualmente creará bandas, incluso si es mucho menos malo que en su intento inicial.

(*) Técnicamente, el cambio de contraste es una función de los valores del canal. Esto significa que valores de origen idénticos producen resultados idénticos. Por lo tanto, no puede tener más colores en la salida que en las entradas. Pero diferentes valores de entrada pueden producir resultados idénticos. Entonces, a menos que su función sea la identidad, siempre perderá colores (pero proporcionalmente perderá muchos menos colores con 16 bits). Si observa el histograma, un histograma plano en la imagen de origen se transforma en un peine, con espacios en un lado y picos en el otro.

Bueno, sí, el color de 16 bits sin tramado de salida obviamente no es bueno. También ayuda evitar los colores 100% puros.

Puede hacerlo directamente desde el cuadro de diálogo Exportar PNG de Inkscape.

Haga clic en Avanzado y seleccione la opción Profundidad de bits: RGBA_16

ingrese la descripción de la imagen aquí

Esto es casi lo que hice cuando exporté a PNG de 16 bits, porque exporté a RGB_16. Pero no ayudó. Leí en algún lugar de los foros de Inkscape que probablemente solo multiplica un valor de 8 bits.
@scriptfoo Acabo de probar un PNG RGBA_16 generado por Inkscape en un degradado y hay pocas o ninguna banda visible. El uso de una imagen de 16 bits no significa necesariamente que no obtendrá ninguna banda. Puede ayudar a reducirlo. A veces, ni siquiera notará mucha diferencia entre una imagen de 8 bits/16 bits. También puede depender del gradiente en sí.
¿Qué versión de Inkscape era? Uso Ubuntu/Inkscape 1.0.1 y obtengo una banda roja/verde en un degradado de negro a amarillo donde la intensidad se multiplica localmente por hasta 4. Gimp reconoce el PNG como RGB de 16 bits.
@scriptfoo Versión 1.0 (4035a4fb49, 2020-05-01). Uso Windows 10. ¿Puedes compartir el SVG en SVGShare.com?
Agregué un ejemplo con un SVG compartido.
El rectángulo de la imagen de ejemplo tiene la opacidad establecida en 91,4 %, lo que significa que es semitransparente. Entonces, si está emitiendo como RGB_16 sin el canal alfa, en lugar de RGBA_16 (con el canal alfa), esa podría ser la fuente de su problema.
Exportar a RGBA_8 y RGB_16 da una banda similar del componente rojo.
¿Por qué estás usando GIMP para ajustar el contraste? ¿Por qué no hacer el degradado que realmente necesita en Inkscape correctamente? Lo siento, pero obtendrá bandas si lo hace en GIMP. es inevitable
Como este ejemplo . Su problema no tiene nada que ver con el renderizado de Inkscapes, sino porque está destruyendo totalmente la imagen en GIMP.
Hay varias razones, como la adición de capas. Un color de 16 bits estirado cuatro veces tiene 16384 tonos por componente. Con una herramienta adecuada, debería generar bandas imperceptibles en un monitor típico.