Un contexte en niveaux de gris avec Quartz2D

Bonjour à  tous image/smile.png' class='bbc_emoticon' alt=':)' />



J'ai un petit soucis de compréhension concernant les contextes graphiques sous Quart2D. Plus précisément, je souhaite créer un contexte de Bitmap en niveau de gris afin de dessiner soit en blanc soit en noir.



J'ai commencé par créer un contexte de niveaux de gris sans transparence (alpha) :


<br />
CGContextRef MyCreateBitmapContext (int pixelsWide,<br />
									int pixelsHigh)<br />
{<br />
	CGContextRef	context = NULL;<br />
	CGColorSpaceRef colorSpace;<br />
	void *		  bitmapData;<br />
	int			 bitmapByteCount;<br />
	int			 bitmapBytesPerRow;<br />
  <br />
	bitmapBytesPerRow   = (pixelsWide);// 1<br />
	bitmapByteCount	 = (bitmapBytesPerRow * pixelsHigh);<br />
  <br />
	colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericGray);// 2<br />
	bitmapData = malloc ( bitmapByteCount );// 3<br />
	if (bitmapData == NULL)<br />
	{<br />
		fprintf (stderr, &quot;Memory not allocated&#33;&quot;);<br />
		return NULL;<br />
	}<br />
	context = CGBitmapContextCreate (bitmapData,// 4<br />
									 pixelsWide,<br />
									 pixelsHigh,<br />
									 8,	  // bits per component<br />
									 bitmapBytesPerRow,<br />
									 colorSpace,<br />
									 kCGImageAlphaNone);<br />
  <br />
	CGContextSetInterpolationQuality(context, kCGInterpolationHigh);<br />
	CGContextSetShouldAntialias(context, NO);<br />
  <br />
	if (context== NULL)<br />
	{<br />
		free (bitmapData);// 5<br />
		fprintf (stderr, &quot;Context not created&#33;&quot;);<br />
		return NULL;<br />
	}<br />
	CGColorSpaceRelease( colorSpace );// 6<br />
  <br />
	return context;// 7<br />
}<br />




Je dessine en utilisant des couleurs en niveaux de gris définies comme suit :


<br />
switch(color){<br />
			case WHITE: CGContextSetGrayFillColor(drawContext, 0,0); break;<br />
			case BLACK: CGContextSetGrayFillColor(drawContext, 0,1); break;<br />
		}<br />




Malheureusement, tout mon dessin est noir à  chaque fois image/sad.png' class='bbc_emoticon' alt=':(' />



Par contre si je déclare le contexte en kCGImageAlphaOnly et que que j'utilise des couleurs comme suit :


<br />
switch(color){<br />
			case WHITE: CGContextSetGrayFillColor(drawContext, 0,0); break;<br />
			case BLACK: CGContextSetGrayFillColor(drawContext, 1,0); break;<br />
		}<br />




le dessin en noir et blanc fonctionne.



J'aimerai comprendre pourquoi dans un cas, cela marche et l'autre non ??!!!



Merci pour votre aide image/smile.png' class='bbc_emoticon' alt=':)' />
Mots clés:

Réponses

  • CéroceCéroce Membre, Modérateur
    février 2013 modifié #2
    Ton utilisation de CGContextSetGrayFillColor() est incorrecte. Les paramètres sont: (contexte, niveau de gris, opacité).

    Tu devrais donc avoir:



    Blanc:
    <br />
    CGContextSetGrayFillColor(drawContext, 1.0, 1.0);<br />
    




    Noir:
    <br />
    CGContextSetGrayFillColor(drawContext, 0.0, 1.0);<br />
    




    ça marche dans le second cas parce que tu modifies la couche alpha, au lieu de la couche grise.



    (P.S.: Il n'est plus nécessaire de réserver la mémoire soi-même dans les versions récentes d'iOS et OS X. On peux passer NULL pour bitmapData).
  • Merci image/smile.png' class='bbc_emoticon' alt=':)' /> J'avais en fait mal recopié mon soucis, mais il y avait bien une erreur :



    en fait je pensais qu'en choisissant un contexte avec un espace de couleur de gris sans opacité, je la valeur de l'opacité dans la définition de la couleur était neutre alors que pas du tout.



    Il fallait donc bien mettre la valeur d'opacité à  1 !!!



    Merci pour cette réponse rapide image/tongue.png' class='bbc_emoticon' alt=':P' />
Connectez-vous ou Inscrivez-vous pour répondre.