Outils pour utilisateurs

Outils du site


issue117:inkscape

Filters are an important topic for making the most out of Inkscape – at least for artistic endeavours. There's always a danger with vector graphics that they can end up looking too precise and sterile for some uses, and filters offer a way to add back in some of the subtle (and not so subtle) variations in texture and color that are often a hallmark of bitmap graphics. At least that's my justification for having spent the previous nine instalments of this series discussing filters but, having described each primitive in some detail and shown a few filter chains along the way, this article is the last on the topic, and I'll move on to something else next month. Way back in part 48, I briefly mentioned the source input columns at the right of the filter dialog (outlined in red). We've spent a little time with “Source Alpha”, and a lot more with “Source Graphic”, but that still leaves four other options that have, so far, been completely ignored. There's a good reason for that: quoting from part 48, I wrote “of the six inputs shown in the UI, two of them require special treatment… and another two don’t work at all!” Let's first of all rule out the two that don't work. “Fill Paint” and “Stroke Paint”, according to the SVG specification, should do exactly what their names suggest. They should act in a similar way to the Flood primitive, by filling the filter area with a color, but rather than specifying the value within the filter primitive itself, it is taken from the selected object's Fill or Stroke color. This sounds like a great way of pulling a couple of colors into your filter chain, and allowing you to create filters that can adapt to the colors of the objects they're applied to. Except it doesn't work at all in Inkscape.

Les filtres sont un sujet important pour tirer le meilleur parti d'Inkscape - au moins, pour des activités artistiques. Il y a toujours un danger avec le dessin vectoriel : qu'il puisse paraître, au final, trop précis et stérile pour certains usages ; les filtres sont souvent une façon de rajouter de fines (et pas si fines) variations dans la texture et la couleur qui sont souvent la marque de fabrique des dessins bitmap. Du moins, c'est la raison pour laquelle j'ai choisi de passer les neuf derniers articles de la série à vous présenter les filtres ; mais, ayant décrit chaque primitive dans le détail et montré quelques chaînes de filtrage ce faisant, cet article est le dernier sur ce sujet, et je passerai à autre chose le mois prochain.

Dans la partie 48, j'ai mentionné rapidement les colonnes d'entrées source sur la droite du dialogue des filtres (soulignées en rouge). Nous avons passé un peu de temps avec l'« Opacité de la source » et beaucoup plus avec la « Source image » ; mais, il reste quatre autres options qui ont été complètement ignorées jusqu'à maintenant. Il y a une bonne raison à cela, car dans la partie 48, j'ai écrit : « des six entrées visibles dans l'interface utilisateur, deux d'entre elles réclament un traitement spécial… et deux autres ne fonctionnent pas du tout ! »

Tout d'abord, réglons le sort des deux qui ne fonctionnent pas. « Remplissage » et « Remplissage du contour », d'après la spécification SVG, devraient faire exactement ce que suggèrent les noms. Elles devraient agir comme pour la primitive Remplissage, en remplissant la zone de filtrage avec une couleur, mais, plutôt que de spécifier la couleur dans la primitive de filtrage elle-même, elle est prise à partir de la couleur de remplissage ou de contour de l'objet sélectionné. Ceci semble être une façon brillante d'introduire une paire de couleurs dans votre chaîne de filtrage, vous permettant de créer des filtres qui s'adaptent aux couleurs des objets auxquelles elles sont appliquées. Sauf que ça ne fonctionne pas du tout dans Inkscape.

There's one obvious technical issue with these input sources: a fill or stroke in SVG can be more than a simple flat color. This doesn't really affect their use in a filter chain – a pattern can be repeated to fill the filter region, as can a gradient if the definition allows it – but it does significantly complicate the rendering process for Inkscape, and has not (yet) been tackled by the developers. Nevertheless, even just being able to use solid colored fills and strokes would be a useful addition. If there are no plans to add even that much, it's long past the time when these couple of columns should be removed from the UI to avoid further confusion. The remaining source inputs, “Background Image” and “Background Alpha” can be used within Inkscape, but only after a little preparation. These inputs represent an “image snapshot of the canvas under the filter region at the time that the 'filter' element is invoked” (according to the SVG spec). In other words, they pull in a flattened bitmap version of the drawing behind the filter region (or just the alpha channel of the same area), and make it available inside the filter chain, much like a bitmap pulled in via the Image primitive. The spec also points out, however, that holding a copy of the background image in memory “can take up significant system resources”, so the SVG content must “explicitly indicate” to the application that the document needs access to the background before these two input sources will have any effect. It then goes on to define how a document should specify that it needs access to the background by putting an attribute called “enable-background” onto an ancestor container element, giving it a value of “new”. You can fiddle around with the XML editor, or even modify your file's source code in a text editor, to achieve this, but there is a much easier way.

Il y a un problème technique évident avec ces deux sources d'entrée : un remplissage ou un contour peut être plus qu'une simple couleur unie dans SVG. Ceci n'affecte pas vraiment leur utilisation dans une chaîne de filtres - un motif peut être répété pour remplir la zone de filtrage, de même qu'un dégradé, si la définition le permet - mais cela complique de manière significative le processus de rendu pour Inkscape, et cela n'a pas (encore) été abordé par les développeurs. Néanmoins, même la simple possibilité d'utiliser une couleur unie de remplissage ou de contour serait un ajout utile. S'ils ne projettent pas d'ajouter au moins cela, il y a longtemps que ces deux colonnes auraient dû être supprimées de l'interface pour éviter toute confusion.

Les sources d'entrée restantes, « Image de fond » et « Opacité de fond », peuvent être utilisées dans Inkscape, mais seulement après une petite préparation. Ces images représentent un « image instantanée du canevas sous la zone du filtrage au moment où l'élément de filtrage est invoqué » (d'après la spécification SVG). En d'autres termes, ils introduisent une image bitmap du dessin derrière la zone de filtrage (ou simplement le canal alpha de cette même zone) et la rendent disponible dans la chaîne de filtrage, comme l'introduction d'un bitmap via la primitive Image (ou presque). Cependant, la spécification indique aussi que la conservation d'une image de l'arrière-plan en mémoire « peut prendre une quantité significative des ressources système » ; aussi, le contenu SVG doit « indiquer explicitement » à l'application que le document doit avoir accès à l'arrière-plan avant que l'une de ces deux sources puisse avoir le moindre effet. Puis, elle définit comment spécifier à un document qu'il doit avoir accès à l'arrière-plan, en plaçant un attribut « enable-background » (activer l'arrière-plan) dans l'élément conteneur ascendant, lui donnant la valeur « new » (nouveau). Vous pouvez bricoler l'éditeur XML ou même modifier le code source du fichier dans un éditeur de texte, mais il y a une façon beaucoup plus facile de le faire.

Before explaining the simpler method, I'll use a very basic test file to clarify exactly what I'm talking about. Here I have a pair of green circles as my background objects. The background consists of any content below the filtered object in the z-order, so could just as easily have been a single shape or an entire drawing. In front of the circles is a red square, the object I'll be applying the filter to. The filter itself is quite simple – just a Color Matrix primitive set to Hue Rotate mode, using Background Image as the source. The result, at this point, is rather disappointing. The square simply becomes transparent, with no effect on the background circles at all. Now to add the “enable-background” attribute. Just open the Layers dialog and change the blend mode for one of the layers to something other than “Normal” (see Part 9 of this series if necessary). Don't panic if it has an unexpected effect on your image, as you can immediately change it back to “Normal” once again. The magic will already have been done. My test image now looks like this, with the background colors rotated within the area covered by the square's filter region. By default the filter region extends beyond the selected object, which is why the color shift is present outside the dotted outline of the selection box. The square itself has disappeared, because there's nothing in the filter chain that pulls in the “Source Graphic” input. So what happened? What was the black arts and voodoo that made the filter work just by changing a blend mode, then immediately changing it back again? It's actually quite simple: the blend mode popup in the layers dialog is just a shorthand way to add a filter with a Blend primitive to the document. You can even see it appear in the filter editor.

Avant d'expliquer cette méthode plus simple, j'utiliserai un fichier texte très basique pour clarifier exactement ce dont je parle. Voici un couple de cercles verts qui seront mes objets d'arrière-plan. L'arrière-plan est constitué de tous les contenus qui sont sous l'objet filtré dans l'axe z ; ce peut être aussi bien une forme simple qu'un dessin complet. Devant les cercles se trouve un carré rouge, l'objet sur lequel j'appliquerai le filtre.

Le filtre lui-même est assez simple, juste une primitive Matrice de couleurs réglée sur le mode Décalage de teinte, en utilisant l'Image de fond comme source.

Le résultat, à cet instant, est plutôt décevant. Le carré devient simplement transparent, sans aucun effet sur les cercles d'arrière-plan.

Maintenant, ajoutons l'attribut « enable-background ». Ouvrez simplement le dialogue des calques et changez le mode de fondu de l'un des calques pour autre chose que « Normal » (voyez la partie 9 de la série, si nécessaire). Ne paniquez pas si un effet inattendu apparaît sur votre image, car nous allons immédiatement revenir à « Normal ». La magie devrait déjà avoir agi.

Mon image de test ressemble maintenant à ceci, avec les couleurs d'arrière-plan qui ont changé dans le secteur couvert par la zone de filtrage du carré. Par défaut, la région de filtrage s'étend bien au-delà de l'objet sélectionné ; c'est pourquoi le changement de couleur est présent à l'extérieur de la ligne pointillée de la boîte sélectionnée. Le carré lui-même a disparu, parce qu'il n'y a rien dans la chaîne de filtrage qui vient de la Source image. Alors, que s'est-il passé ? Quelle magie noire, quel vaudou a fait que le filtre fonctionne juste en changeant un mode de fondu, puis en revenant immédiatement à la valeur initiale ? C'est vraiment très simple : le choix du mode de fondu dans le dialogue des calques est un raccourci pour ajouter un filtre avec la primitive Mélange à l'objet. Vous pouvez même voir qu'il apparaît dans l'éditeur de filtre.

Although it appears in the dialog, the filter isn't attached to any objects that you can select on the canvas. Rather it is linked to the layer itself. Remember that layers are just a group with some Inkscape-specific attributes added, so it's not really any different to having a filter applied to a group of objects. When the filter is created, Inkscape automatically connects the inputs of the Blend primitive to the Source Graphic (i.e. the layer that's actually a group), and to the Background Image. At the same time, it adds the “enable-background” attribute to the root node of the SVG document, visible here in Inkscape's XML editor. The key thing is that switching the Blend Mode back to “Normal” leaves this attribute intact, although it does remove the filter. From that point on, however, you are free to use the Background Image and Background Alpha inputs in your own filter chains. That concludes our detailed examination of the mysterious art of creating your own filter chain. But, if you've been experimenting, you've doubtlessly noticed that Inkscape already supplies an extensive list of ready-made filters, grouped by type, that make up the bulk of the Filters menu. Whilst there are those gallant masochists who dare to brave the shortcomings of Inkscape's UI to create their own complex filters from scratch, many more users simply work with the default set provided. But with the knowledge you've gained over the past few months you can do better than that: you can start with a standard filter, but then dive into its guts to edit and tweak it to suit your needs. I shan't spend any time going exhaustively through the list of default filters, but instead encourage you to explore them on your own. Try creating a test sheet with some different objects and groups to work on: some of the filters work best on small objects, others on large ones; some require colorful content, others work just as well with a monochrome shape; some are wasted on intricate outlines, whilst others fail just as easily on featureless blocks of color.

Bien qu'il apparaisse dans le dialogue, le filtre n'est attaché à aucun objet que vous puissiez sélectionner sur le canevas. Il est plutôt lié au calque lui-même. Souvenez-vous que les calques sont juste un groupe auquel sont ajoutés quelques attributs spécifiques à Inkscape ; aussi, ce n'est pas vraiment différent d'un filtre appliqué à un groupe d'objets. Quand le filtre est créé, Inkscape connecte automatiquement les entrées de la primitive Mélange à la Source image (c'est-à-dire le calque qui est vraiment un groupe) et à l'Image de fond. En même temps, il ajoute l'attribut « enable-background » au nœud racine du document SVG, visible ici dans l'éditeur XML d'Inkscape.

Le point clé est que le retour du Mode de rendu à « Normal » laisse cet attribut intact, alors qu'il a bien retiré le filtre. A partir de ce moment-là, vous êtes libre d'utiliser les entrées Image de fond et Opacité de fond dans vos propres chaînes de filtrage.

Ceci conclut notre examen détaillé de l'art mystérieux de la création de vos propres chaînes de filtrage. Mais, si vous avez fait des tests, vous avez noté, sans aucun doute, qu'Inkscape fournit déjà une liste étendue de filtres prêts à l'emploi, groupés par type, qui représentent la majeure partie du menu des Filtres. Pendant qu'il y a ces courageux masochistes qui osent braver les défaillances de l'interface utilisateur d'Inkscape pour créer leurs propres filtres complexes « ex nihilo », beaucoup plus d'utilisateurs travaillent simplement avec l'ensemble fourni par défaut. Mais, avec le savoir que vous avez engrangé ces derniers mois, vous pouvez faire mieux que ça : vous pouvez commencer avec un filtre standard, puis plonger dans ses entrailles pour l'éditer et l'ajuster pour répondre à vos besoins.

Je ne perdrai pas de temps à passer exhaustivement en revue la liste des filtres par défaut, mais, à la place, je vous encourage à les explorer vous-même. Essayez de créer une feuille de test avec différents objets et groupes pour travailler dessus : certains filtres fonctionnent mieux avec des petits objets, d'autres avec des grands ; certains ont besoin d'un contenu coloré, d'autres marchent avec une simple forme monochrome ; certains sont perdus avec des contours compliqués, pendant que d'autres sont en défaut sur de simples blocs de couleur sans fioritures.

A useful ability of Inkscape is that, when you copy and paste an object from one document to another any attached filters are copied with it. Why not start a “filter library” – a document into which you copy any particularly useful or impressive filters? Each time you create or find a great filter, just apply it to a suitable object, then copy and paste it into your library file. Similarly, when you want to use a filter from the library, just copy the object from the library file and paste it into your current creation. The filter will appear in the filters dialog, and, once you've applied it to something else in your image, you can safely delete the object you pasted in. Other users have already posted their own filter collections online – search for “Inkscape filter pack”, for example – so you might find that someone else has already created just the filter you need, and it's only a copy and paste away from being used in your drawings. When constructing your own filter chains from scratch, there's never really a question about what happens when you combine two primitives. You want a blurring and desaturating filter? No problem, just chain a Gaussian Blur primitive with a Color Matrix primitive (in Saturate mode). But what happens when you want to do the same with the default filters? There's an ABCs > Simple Blur (which consists of just a Gaussian Blur primitive) and also a Color > Desaturate filter in the menu (which provides a single Color Matrix primitive). What happens when you add both of them to an object? If you try it, you'll see that you get a blurred, desaturated result, so it is possible to combine the default filters in this way. But there's something odd going on in the filter chain. We don't have just the two primitives we might anticipate, but also a third one: an additional Color Matrix between the two primitives we expected. If you look closely you'll see that it's not even connected to the last primitive, so plays no active role in this chain. You can delete it entirely and it won't have any effect. So why is it there?

Une possibilité classique d'Inkscape est que, quand vous copiez/collez un objet d'un document à un autre, tous les filtres attachés le suivent. Pourquoi ne pas commencer une « bibliothèque de filtres », un document dans lequel vous copiez tout filtre particulièrement utile ou impressionnant ? Chaque fois que vous créez ou trouvez un filtre génial, appliquez-le simplement à un objet approprié, puis copiez/collez-le dans le fichier de la bibliothèque. De même, quand vous voulez utiliser un filtre de votre bibliothèque, copiez juste l'objet du fichier de la bibliothèque et collez-le dans votre dessin en cours de création. Le filtre apparaîtra dans le dialogue des filtres et, une fois appliqué à quelque chose d'autre dans votre image, vous pourrez effacer sans risque l'objet tiré de la bibliothèque. Des utilisateurs ont déjà posté en ligne leurs propres collections de filtres ; cherchez « Inkscape filter pack » (paquet de filtres Inkscape), par exemple ; vous pourriez trouver ainsi que quelqu'un d'autre a déjà créé le filtre dont vous avez besoin, et il vous suffit d'un copier/coller pour l'utiliser dans vos propres dessins.

Quand vous créez vos propres chaînes de filtrage à partir de rien, la question sur ce qui se passe en combinant deux primitives ne se pose pratiquement jamais. Vous voulez un filtre pour flouter et dé-saturer ? Pas de problème, simplement enchaînez une primitive Flou gaussien avec une primitive Matrice de couleurs (en mode Saturation). Mais qu'arrive-t-il si vous voulez faire la même chose avec les filtres par défaut ? Il y a, dans le menu Filtres, Flou > Flou ( qui fournit une simple primitive Flou gaussien) et aussi Couleurs > Brillance (qui fournit une simple primitive Matrice de couleurs). Que se passe-t-il si vous ajoutez les deux à un objet ? Si vous l'essayez, vous verrez que vous obtenez un résultat flou et dé-saturé ; ainsi, il est possible de combiner de cette manière les filtres par défaut. Mais il se passe un truc bizarre dans la chaîne de filtres. Vous n'avez pas seulement les deux primitives que vous avez prévu, mais aussi une troisième : une Matrice de couleurs supplémentaire entre les deux primitives attendues.

Si vous regardez avec attention, vous verrez qu'elle n'est même pas reliée à la dernière primitive ; elle ne joue donc aucun rôle actif dans la chaîne. Vous pouvez la supprimer et cela n'aura aucun effet. Alors, pourquoi est-elle là ?

It turns out that this is actually a rather nice addition on the part of the Inkscape developers. Let's suppose you want to add another filter to this chain, but it's one that would normally use Source Alpha as an input. To prevent any unexpected results, you need it to use the alpha from the previous filter output, which will usually not be the same as the Source Alpha at all. These extra Color Matrix primitives act as intermediate alpha outputs within the chain. So with the addition of these, you can not only link any new primitives into the image output of each filter, but also to its alpha output as well. It's impressive that you can combine filters in this way and have them work as expected, but it can quickly lead to long, complex and hard to manage filter chains. Often a better approach is to apply one filter, then group your object before applying the next filter to the group. You can repeat this as often as necessary, creating ever deeper nesting of groups, each with its own filter applied. This certainly makes it easier to manage them in the filters dialog, as there's far less confusion about which filter you're modifying, especially if you name them well. One final thing to note is that, in 0.91 (and the just released 0.92!), many of the default filters now have an ellipsis (three dots, “…”) after their name. Choosing one of these opens a dialog which lets you enter parameters for the filter, and even see a live preview. Of course this is just a shortcut to setting parameters in the individual filter primitives, but is a welcome addition that can expose the most important parameters from across a number of primitives, whilst hiding all the other options and settings that aren't relevant in most cases. Unfortunately, there's no way to get this simplified UI back once you've dismissed it, so any subsequent tweaks will mean diving into all the gory details of the individual primitives again. Some of the separate filters from 0.48 have also been dropped, since the new parameterized filters can achieve the same effects and more. If you can't find an old favourite filter in the newer releases, look for a similar name with an ellipsis, and start tweaking the parameters!

Il s'avère que c'est un ajout plutôt sympa de la part des développeurs d'Inkscape. Supposons que vous vouliez ajouter un autre filtre à cette chaîne, mais que ça en soit un qui utiliserait normalement l'Opacité de la source comme entrée. Pour empêcher tout résultat inattendu, vous avez besoin qu'il utilise l'alpha à partir de la sortie du filtre précédent, qui ne sera en général pas du tout pareil que l'Opacité de la source elle-même. Ces primitives Matrice de couleurs supplémentaires agissent comme des sorties alpha intermédiaires dans la chaîne. Ainsi, avec l'ajout de celles-ci, vous pouvez non seulement lier toute nouvelle primitive à l'image de sortie de chaque filtre, mais aussi à la sortie alpha.

Pouvoir combiner des filtres de cette manière et les voir fonctionner comme prévu est impressionnant, mais cela peut conduire rapidement à de longues chaînes de filtrage compliquées et difficiles à gérer. Une meilleure approche est souvent d'appliquer un filtre, puis de grouper votre objet avant d'appliquer le filtre suivant au groupe. Vous pouvez répéter ceci autant de fois que nécessaire, créant un emboîtement toujours plus long de groupes, chacun ayant son propre filtre. Ceci rend certainement plus facile leur gestion dans le dialogue des filtres, car il y a beaucoup moins de confusion sur quel filtre vous êtes en train de modifier, particulièrement si vous les nommez bien.

Une dernière chose à noter est que, dans la 0.91 (et dans la 0.92 qui vient de sortir !), beaucoup de filtres par défaut ont des points de suspension (trois points « … ») en fin d'appellation. Le choix de l'un d'eux ouvre une boîte de dialogue qui vous permet de saisir les paramètres du filtre et voir une prévisualisation immédiate. Bien sûr, c'est juste un raccourci pour régler les paramètres de chaque primitive de filtrage, mais c'est une addition bienvenue qui peut présenter les paramètres les plus importants de nombre de primitives, tout en cachant les autres options et réglages qui n'ont aucun intérêt dans la plupart des cas. Malheureusement, vous n'avez aucune possibilité de retrouver cette interface simplifiée une fois que vous l'avez renvoyée ; aussi, tout réglage ultérieur nécessitera de plonger à nouveau dans tous les détails sordides de chaque primitive. Certains filtres distincts venant de la 0.48 ont été aussi supprimés, puisque les nouveaux filtres paramétrés peuvent réaliser les mêmes effets, voire plus. Si vous ne trouvez pas votre vieux filtre favori dans les nouvelles versions, cherchez un nom voisin avec trois points de suspension et commencez à ajuster les paramètres !

issue117/inkscape.txt · Dernière modification : 2017/02/03 16:54 de andre_domenech