Outils pour utilisateurs

Outils du site


issue81:inkscape_-_p._21

Table des matières

1

Over the past five instalments, we've used Inkscape to trace bitmap images, both manually and automatically. In part 17 I introduced a sketch of a cartoon character, “Frankie”, and proceeded to demonstrate a few ways to manually trace it. The first method was simply to draw over the outlines using the normal Bézier Path tool, which resulted in a drawing like this: Seeking some variation in the outlines, I then proceeded to introduce a number of ways to trace the sketch, but they all suffered from one obvious omission: color. Although they introduced some dynamics to the image, they all resulted in the outline being rendered as a single filled path. The best looking result arguably came from automatically tracing an inked and cleaned-up version of the image (see part 19 for details), but that still produced only a nice looking outline consisting of a single complex path with over 1000 nodes. Changing the fill on this image would just result in a colored outline. In order to color the drawing itself, it's necessary to create each area of color as a separate path that can be placed below the outline. In other words you have to manually re-draw each area of the image to create a set of paths that can be filled. If it sounds like a lot of extra work, that's because it is, but Inkscape does have a Paint Bucket tool that can help.

Au cours des cinq derniers épisodes, nous avons utilisé Inkscape pour tracer - manuellement et de façon automatique - des images bitmap. Dans la partie 17, j'ai présenté l'esquisse d'un personnage de BD, « Frankie » et j'ai démontré quelques méthodes pour la tracer à la main. La première était tout simplement de dessiner par-dessus les contours en se servant de l'outil standard des courbes de Bézier (l'outil « Bézier » ou « Pen »), ce qui a donné quelque chose comme ceci :

À la recherche de variations dans les contours, j'ai alors présenté plusieurs façons de tracer l'esquisse, mais toutes souffraient du manque évident de la couleur. Bien qu'elles aient introduit quelque dynamique à l'image, le résultat en était que le contour fut rendu comme un seul chemin rempli. On peut soutenir que le traçage automatique d'une version encrée et nettoyée de l'image a donné le meilleur résultat (voir la partie 19 pour les détails), mais cela n'a produit qu'un joli contour composé d'un seul chemin complexe avec plus de 1 000 nœuds.

Si l'on changeait le remplissage de cette image, on n'aurait comme résultat qu'un contour coloré. Pour pouvoir colorer l'esquisse elle-même, il faut créer chaque zone de couleur comme un chemin distinct qui peut se placer sous le contour. Si ça a l'air d'être pas mal de travail supplémentaire, c'est parce que ça l'est, mais Inkscape possède un outil pour remplir des zones délimitées (l'outil « Paint Bucket ») qui peut vous aider.

2

The Paint Bucket – sometimes referred to as a Fill or Flood Fill tool – is commonly found in bitmap editors such as The GIMP, so you may already be familiar with its basic operation. In Inkscape, it's present in the main tool palette and can be selected using the Shift-F7 keyboard shortcut, by pressing the “u” key on the keyboard (easier to remember if you imagine it as a sort of bucket shape), or by clicking on the icon. Once selected, clicking the mouse inside a “bounded region” in your drawing will create a path that fills it with the currently selected fill and stroke. In simple terms, a bounded region just means an area of a single color that is completely surrounded by a differently colored border, with no breaks. In practice the color of the border must be significantly different from the area you are filling. The region to be filled is actually calculated based on the color of each pixel in the area, so it's a bitmap operation rather than a vector one. The pixel you click on is taken as the starting point, then the algorithm tries to expand outwards by considering adjacent pixels. If a pixel's color is close to that of the starting pixel, then it gets added to the fill region and the algorithm continues by considering the adjacent pixels of the newly enlarged region. If the pixel's color is significantly different from that of the starting pixel (i.e. it's the boundary color), then it's not added to the fill region and the process stops trying to grow in that direction. This is repeated until the fill region can't grow any further because it has hit the boundary on all sides. Finally Inkscape creates a path that surrounds most of the pixels in the fill region, converting the bitmap-based search into a vector result.

L'outil Paint Bucket - parfois appelé outil de remplissage ou « Flood Fill » - se trouve fréquemment dans des éditeurs de bitmap tels que GIMP et il se peut que vous sachiez déjà comment il fonctionne. Dans Inkscape, il se trouve dans la barre d'outils principale et peut être sélectionné au moyen du raccourci clavier MAJ-F7, en appuyant sur la touche « u » du clavier (la forme de cette lettre ressemble un peu à un seau (ou « bucket »), enfin en cliquant sur l'icône.

Une fois l'outil sélectionné, si vous cliquez à l'intérieur d'une zone limitée (« bounded region ») vous créerez un chemin qui le remplit du Remplissage et contour actuellement sélectionné. En termes simple, une zone limitée signifie tout simplement une zone d'une seule couleur entièrement entourée, sans rupture, par une bordure d'une autre couleur. En pratique, la couleur de la bordure doit être sensiblement différente de celle de la zone que vous remplissez.

La zone à remplir est en fait calculée sur la couleur de chacun de ses pixels et il s'agit ainsi d'une opération bitmap plutôt qu'une opération vectorielle. Le pixel sur lequel vous cliquez est censé être le point de départ ; ensuite l'algorithme essaie de s'étendre vers l'extérieur en analysant les pixels contigus. Si la couleur d'un pixel est proche de celle du pixel de départ, il est rajouté à la zone de remplissage et l'algorithme continue en analysant les pixels voisins de la nouvelle zone élargie. Si la couleur du pixel est sensiblement différente de celle du pixel du départ (c'est-à-dire la couleur de la bordure), il n'est pas ajouté à la zone de remplissage et le processus n'essaie plus de s'étendre dans cette direction-là. Cela est répété jusqu'à ce que la zone de remplissage ne puisse plus s'étendre parce qu'elle a atteint une bordure sur tous les côtés. Enfin, Inkscape crée un chemin qui entoure la plupart des pixels dans la zone de remplissage, convertissant ainsi la recherche basée sur un bitmap en résultat vectoriel.

3

If all that talk of algorithms has got you confused, a simpler way to imagine it is as though you're trying to pour ink into a shallow dish. The ink will spread out along the base of the dish – but only where the base is flat and even enough – and stop when it reaches the edges. Similarly the bucket-fill algorithm tries to spread the fill region out – where the colors are similar enough – and stops when it reaches the contrasting boundary. Taking a closed star as our object to be filled, zooming it to fill the screen, then clicking anywhere in the white interior, will produce something like this: In this case the tool was set to a dark red fill and no stroke, and we've managed to create a new path which approximately fills the outline. It's only approximate because the new path doesn't actually reach the edges and corners of the star, leaving a thin gap that shows up when zooming in within Inkscape. This is a common problem with the bucket fill tool, but it can be alleviated to some extent by setting the “Grow/shrink by” option on the tool control bar to a positive number. This will cause the calculated path to grow outwards so that it overlaps the boundary a little. Set it too high and it will extend beyond the boundary, so a little trial and error is often needed. You can also use a negative number in order to shrink the path away from the boundary if you want to. Here's a close-up of the top point of the star with different grow/shrink values.

Si toutes ces références aux algorithmes vous ont plongé dans la confusion, imaginez que vous essayez de verser de l'encre dans un plat peu profond et ce sera plus simple : l'encre s'étendra sur le fond du plat - mais uniquement là où le fond est plat et assez lisse - et s'arrêtera quand l'encre en aura atteint les bords. De façon similaire, l'algorithme du seau de remplissage essaie d'élargir la zone de remplissage - là où les couleurs se ressemblent assez - et s'arrête quand il atteint la bordure contrastée.

Choisir une étoile fermée comme objet à remplir, l'agrandir jusqu'à ce qu'elle remplisse l'écran, puis cliquer n'importe où dans son intérieur blanc, produira quelque chose comme ceci :

Ici, l'outil a été réglé sur rouge foncé pour le remplissage et pas de contour et nous avons réussi à créer un nouveau chemin qui remplit à peu près le contour. Ce n'est qu'approximatif, parce que le nouveau chemin n'atteint pas vraiment les bords et les coins de l'étoile, mais laisse un mince espace qui se voit quand vous zoomez dessus dans Inkscape. C'est un problème courant de l'outil seau de remplissage, mais vous pouvez le maîtriser dans une certaine mesure en réglant à un numéro positif l'option « Agrandir/rétrécir de », figurant sur la barre de contrôle de l'outil. Ainsi le chemin calculé s'agrandira vers l'extérieur jusqu'à ce qu'il chevauche un peu la bordure. Si le numéro que vous choisissez est trop élevé, le chemin passera au-delà de la bordure ; il faut souvent procéder par tâtonnements. Vous pouvez également utiliser un numéro négatif qui éloignera le chemin de la bordure, si c'est ce que vous voulez faire. Voici une vue rapprochée de la pointe en haut de l'étoile, avec l'option Agrandir/rétrécir réglée sur différentes valeurs.

4

As our aim is to color a comic sketch, it's the middle option – a positive grow/shrink value – that interests us at this stage. As you can see, the new path extends well into the border but we can send it to the back of the z-index, bring the outline to the front, or draw our color fills on a lower layer, to give us our original outline with the appearance of a filled interior. It's a quick and easy way to fill some of the larger areas of a character like Frankie. It's not a bad start, but there are a few problems. Some of the fills don't quite get into all the corners, or leave gaps near the outlines, and the bucket fill didn't work at all on the jumper and the nut on the right hand side. Let's start by looking at the fill for the face in isolation, temporarily changing the color so it stands out a little more. There are 96 nodes in this path, but many of them aren't really necessary. We don't need it to follow the outline of the mouth and nose, and we certainly don't need to trace every bit of stubble. Even the eyes aren't necessary as we can simply stack their own bucket-filled paths on top of the face path. With a bit of node editing it's easy to simplify this complex path. Adding and subtracting rectangles, ellipses or other paths using the Boolean operations is a quick way to deal with lots of nodes at once. In this case I'll simply draw an approximate path using the Bézier tool (shown in green), then use Path > Union to combine it with the face.

Puisque notre objectif est de colorer une esquisse humoristique, c'est l'option du milieu - une valeur positive pour Agrandir/rétrécir - qui nous intéresse à ce stade. Comme vous pourrez le constater, le nouveau chemin s'étend jusqu'au cœur de la bordure, mais nous pouvons l'envoyer au fond du z-index, amener le contour vers l'avant, ou mettre nos remplissages de couleur sur un calque plus bas, pour avoir le contour original avec l'apparence d'un intérieur rempli. C'est une façon rapide et simple de remplir quelques-unes des grandes zones d'un personnage comme Frankie.

Ce n'est pas un mauvais début, mais il y a quelques problèmes. Quelques-uns des remplissages n'atteignent pas tout à fait tous les coins, ou laissent des vides près des contours et le seau de remplissage n'a pas du tout fonctionné sur l'écrou et le cavalier côté droit. Commençons par regarder le remplissage de la figure seule, en changeant la couleur de façon temporaire afin qu'il se voie davantage.

Ce chemin contient 96 nœuds, mais beaucoup d'entre eux ne sont pas vraiment nécessaires. Nous n'en avons pas besoin pour suivre le contour de la bouche et du nez et nous n'avons vraiment pas besoin de tracer chaque poil. Même les yeux ne sont pas nécessaires, puisque nous pouvons empiler leurs propres chemins remplis par-dessus le chemin du visage. Il est facile de simplifier ce chemin complexe en modifiant les nœuds quelque peu. On peut rapidement traiter beaucoup de nœuds en même temps en ajoutant ou en supprimant des rectangles, des ellipses ou autres chemins avec des opérations booléennes. Ici, je vais tout simplement dessiner un chemin approximatif en me servant de l'outil des courbes de Bézier (en vert), puis en utilisant Chemin > Union pour le fusionner avec le visage.

5

Putting this path back into place shows that there are still some gaps around the edges. We can correct this just by dragging a few nodes and handles into position – with the path now significantly simplified this is a much easier job than it would have been previously. The bucket tool often has a problem with concave corners. One way to reduce the issue is to zoom in on the object you're filling. This results in more pixels being used in the flood algorithm, giving a more accurate fill. Unfortunately it only works for small objects because the whole, unbroken boundary has to be visible in the Inkscape drawing window, or at least only slightly outside it. Otherwise you can fill at a low zoom level, then get in closer and fill again to finish off the corners. If the first fill is still selected you can hold Shift to cause the second fill to be added to the same path, or you can simply create them as two paths then use Path > Union to merge them into one. Most commonly, though, it's easiest just to do a little manual node editing to get the path to fill the corners. ide Taking a closer look at the nut and bolt, it's clear that the problem here is a gap in the sketch which means we don't have a completely bounded region to fill.

En remettant ce chemin en place, nous voyons qu'il reste encore quelques vides autour des bords. Nous pouvons corriger ceci en glissant quelques nœuds et poignées à la position qu'il faut - maintenant que le chemin a été amplement simplifié, la tâche est beaucoup plus facile qu'elle ne l'aurait été auparavant.

L'outil « bucket » a souvent un problème avec les coins concaves. Une façon de remédier un peu au problème est de zoomer sur l'objet que vous remplissez. Le résultat en est que davantage de pixels sont utilisés dans algorithme de remplissage, ce qui donne plus de précision. Malheureusement, cela ne fonctionne que pour des petits objets parce qu'il faut que la bordure entière, sans vides, soit visible dans la fenêtre de dessin d'Inkscape, ou au moins très peu en dehors de celle-ci. Sinon, vous pouvez remplir à un niveau de zoom bas, puis zoomer plus et remplir de nouveau pour terminer les coins. Si le premier remplissage reste sélectionné, vous pouvez tenir MAJ pour que le deuxième remplissage soit rajouté au même chemin, ou vous pouvez tout simplement les créer comme deux chemins différents, puis utiliser Chemin > Union pour les fusionner. La plupart du temps, cependant, le plus facile est de faire un peu d'édition de nœuds manuellement, pour que le chemin remplisse les coins.

En regardant le boulon et l'écrou de plus près, il est évident que le problème ici est un vide dans l'esquisse ce qui signifie que la zone à remplir n'est pas entièrement limitée.

6

If your boundary has small gaps in it, then don't despair: the bucket fill tool has a “Close gaps” option on the tool control bar that allows it to automatically deal with such issues. This feature can be set to close small, medium or large gaps, or turned off entirely. Be aware that closing gaps might also prevent it filling legitimate parts of the drawing if you have a complex boundary that pinches together in some areas. Even the “large” setting only closes gaps of a few pixels in size, so you may find it works only if you zoom out a bit – which in turn gives you less accuracy in the corners. An alternative approach is to manually close the gaps. Remember that the fill algorithm is concerned only with how different each pixel's color is from the initial start point. That allows you to use a contrasting color to draw lines or other objects to plug any gaps before filling. I usually draw these plugs in a color that also contrasts with the boundary so that they stand out afterwards and are easy to find and remove. In this case I've drawn a red triangle using the Bézier tool as my plug: it takes only a few clicks to create, but the size and color makes it obvious that it's an object to remove once it's served its purpose. The color is different enough from the white background that the algorithm will just consider it to be part of the boundary. Manually plugging gaps lets you use the bucket fill while still being zoomed in close enough for it to get into the corners. In this case, however, there are enough separate areas that some extra manual work would be needed to color it all anyway, so it's just as easy to manually fill the whole shape. By using the Bézier tool to lay down straight lines that follow the center of the outline it's quite simple to color a small region such as this. Once the Bézier path has been drawn, sending it to the back will hide the straight edges behind the outline to retain the hand drawn final appearance.

Si la limite de votre zone a quelques petits vides, ne désespérez pas : il y a une option « Combler les vides : » sur la barre de contrôle de l'outil « bucket » qui lui permet de corriger de tels problèmes automatiquement. Cette fonction peut être réglée pour qu'elle ferme un vide/des vides - Petit, Moyen ou Grand - ou soit désactivée avec Aucun. Il faut cependant savoir que combler les vides peut parfois l'empêcher de remplir des parties légitimes du dessin si vous avez une bordure complexe qui se rétrécit dans certaines zones. Le choix « Grand » ne ferme que des vides d'une taille de quelques pixels et c'est donc seulement si vous dézoomez un peu que vous pourrez constater qu'il fonctionne, mais cela vous donne moins de précision dans les coins.

Une autre approche serait de combler les vides à la main. Souvenez-vous que l'algorithme de remplissage n'est concerné que par le degré de différence dans la couleur de chaque pixel par rapport au point de départ initial. Cela vous permet d'utiliser une couleur contrastante pour dessiner des lignes ou autres objets pour combler tout vide avant le remplissage. D'habitude, je colmate les vides avec une couleur qui contraste aussi avec la limite de la zone, pour que ma « rustine » soit bien visible après et puisse être trouvée et supprimée facilement. Dans ce cas ma rustine est un triangle rouge fait avec l'outil Bézier : le créer ne nécessite que quelques clic, mais la taille et la couleur le signale comme un objet à supprimer une fois qu'il aura rempli son rôle. Sa couleur est assez différente du fond blanc pour que l'algorithme le traite comme une partie de la bordure.

Combler les vides à la main vous permet d'utiliser le seau de remplissage tout en ayant bien zoomé en avant pour que cela atteigne les coins. Cependant, dans ce cas, de toutes les façons, il y a assez de zones distinctes pour que du travail manuel supplémentaire soit nécessaire pour tout colorer et, en fait, c'est aussi facile de remplir l'objet entier à la main. En utilisant l'outil Bézier pour tirer des lignes droites qui suivent le centre du contour, colorer une petite zone comme celle-ci est très simple. Une fois le chemin de Bézier créé, l'envoyer à l'arrière cachera les bords droits derrière le contour pour garder l'apparence voulue d'un dessin fait à la main.

7

The bucket fill tool also has a few other tricks up its sleeve. Because it works on pixel values, it can be used to fill areas of a bitmap image, even without tracing it first. In that case the background color can often be less than uniform due to artifacts introduced with JPEG compression, so the bucket fill has a Threshold setting on the tool control bar to adjust the amount that a pixel can deviate from the initial starting color for it to still be considered as part of the background. Adjusting this setting lets you fine tune the fill to only very specific colors, or broaden it to allow quite a range. As well as filling bitmaps, this can be handy when you want to fill an area that has a gradient or other color variations. You can also change the basic rule of the algorithm entirely using the “Fill by” pop-up menu. Instead of looking for general changes in pixels' colors you can choose to focus on only the red, green or blue components, the hue, saturation or lightness, or even the alpha channel. These options are rarely used, but could be invaluable when your background and boundary aren't distinct or contrasting enough for the standard algorithm to notice the difference between them. After another manually drawn path for his jumper, and a little node work to remove and re-create the veins in his brain, it's finally time to reveal the finished version of Frankie. Having to separately color each section of a sketch can certainly be time consuming, but if you compare this version with the simple manual trace presented at the start, I hope you'll agree that the extra effort required to maintain some variation in the outline has been worth it. Whilst the manual trace has a decidedly vector feel to the image, this final version retains a lot more of the hand-drawn style.

L'outil « bucket » a également quelques autres tours dans son sac. Parce qu'il fonctionne avec la valeur des pixels, on peut l'utiliser pour remplir des zones d'une image bitmap, même sans la tracer au préalable. Dans ce cas, la couleur de fond peut souvent être tout sauf uniforme à cause des artefacts introduits par la compression JPEG. Pour cette raison, figure sur la barre de contrôle d'outil de « paint bucket » un réglage du Seuil pour ajuster la quantité par laquelle un pixel peut dévier de la couleur de départ initiale pour qu'il soit toujours considéré comme une partie du fond. Régler ceci vous permet d'affiner le remplissage à seulement quelques couleurs très spécifiques, ou, au contraire de l'élargir pour en permettre toute une gamme. Outre le remplissage de bitmaps, cela peut être utile quand vous voulez remplir une zone avec un dégradé ou d'autres variations dans sa couleur.

Vous pouvez également changer complètement la règle de base de l'algorithme au moyen du menu déroulant « Type de remplissage : ». au lieu de rechercher des modifications générales dans la couleur des pixels, vous pouvez choisir uniquement les composants rouge, vert ou bleu, la teinte, la saturation, la luminosité ou même l'opacité. Ces options ne s'utilisent guère, mais pourraient être précieuses quand le contraste de votre fond et de la bordure n'est pas assez prononcé pour que l'algorithme standard puisse remarquer la différence.

Après un autre chemin fait main pour le cavalier et un peu de travail sur les nœuds pour enlever et recréer les veines dans son cerveau, le moment est enfin venu de révéler la version finie de Frankie. Devoir colorer chaque section d'une esquisse peut prendre beaucoup de temps, il est vrai, mais si vous comparez cette version au traçage manuel simple présenté au départ, j'espère que vous serez d'accord que l'effort supplémentaire requis pour que le contour montre toujours des variations valait le coup. Alors que le traçage manuel donne un vrai sentiment de vectorisation de l'image, cette version finie conserve un vrai style fait main.

issue81/inkscape_-_p._21.txt · Dernière modification : 2014/06/10 09:13 de lecastillan