Images : dithering par motif

Contenu du snippet

Le dithering est une vieille technique pour créer une image monochrome à partir d'une image couleur. A une époque, ce fut utile quand les imprimantes n'étaient qu'en noir et blanc. Aujourd'hui, on l'emploie pour l'esthétisme, en particulier, pour avoir un rendu façon photo de journal.

Source / Exemple :


public static void Dithering(Bitmap bitmap)
{
	int width = bitmap.Width;
	int height = bitmap.Height;

	//le pattern à appliquer (il était à l'origine destiné à des niveaux de gris de 64)
	byte[][] pattern = new byte[][]{	new byte[]{0,32,8,40,34,2,10,42},
							new byte[]{48,16,56,24,50,18,58,26},
							new byte[]{12,44,4,36,14,46,6,38},
							new byte[]{60,28,52,20,62,30,54,22},
							new byte[]{3,35,11,43,1,33,9,41},
							new byte[]{51,19,59,27,49,17,57,25},
							new byte[]{15,47,7,39,13,45,5,37},
							new byte[]{63,31,55,23,61,29,53,21}};

	unsafe
	{
		BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

		byte* newPixel = (byte*)(void*)bmpData.Scan0;
		int offset = width % 4;
           
		for (int y = 0; y < height; y++)
		{
			for (int x = 0; x < width; x++)
			{
				//on récupère le niveau de gris sur 255
				byte pixel = (byte)(.3 * newPixel[0] + .59 * newPixel[1] + .11 * newPixel[2]);
				//on compare le pixel (réduit à 64 niveaux) au pattern (en fonction de sa position
				//par rapport à l'image
				if ((pixel>>2)>pattern[x&7][y&7])
					newPixel[0]=newPixel[1]=newPixel[2]=255;
				else
					newPixel[0]=newPixel[1]=newPixel[2]=0;

				newPixel+=3;	
			}
			newPixel += offset;
		}

		bitmap.UnlockBits(bmpData);
	}
}

Conclusion :


Cette technique fut une des premières mises en oeuvre. Voici le principe du dithering dit de Bayer :
On compare les niveaux de gris de l'image (on convertit donc notre image couleur en niveau de gris) avec un motif. Ce dernier est une matrice 8x8, ce qui donne donc 64 niveaux de gris. On compare le pixel de gris (décalé de 2 pour arriver à 64) avec le motif. Les pixels transformés plus grands que leurs éléments de matrice correspondant, sont affichés en blanc (255). Dans le cas contraire, en noir (0).

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.