3

J'essaie de dessiner des rectangles de couleur spécifiques dans un CGBitmapContext puis de comparer les valeurs de pixels avec la couleur que j'ai dessinée (une sorte de hit-test). Sur Leopard, cela fonctionne très bien, mais sur SnowLeopard, les valeurs de pixels que je retire sont différentes des valeurs de couleurs que je dessine - je suppose en raison de la confusion des couleurs et de l'ignorance de ma part.CGBitmapContext obtient la valeur de pixel confusion Leopard vs. SnowLeopard

Les étapes de base i prends sont: -

  1. créer un contexte de bitmap avec une colorspace kCGColorSpaceGenericRGB
  2. mis fillColorSpace du contexte dans le même kCGColorSpaceGenericRGB colorspace
  3. fixé remplissage de couleur
  4. d'étirage du contexte
  5. obtenir le bitmapContextData, itérer les valeurs de pixel, etc.

A titre d'exemple, le léopard si je fais: -

CGContextSetRGBFillColor(cntxt, 1.0, 0.0, 0.0, 1.0); // set pure red fill colour 
CGContextFillRect(cntxt, cntxtBounds); // fill entire context 

chaque pixel a une valeur UInt8 == rouge 255, vert == 0, 0 == bleu, alpha == 255

Sur Snow Lepard cependant, chaque pixel a une valeur UInt8 rouge == 243, vert == 31, bleu == 6, alpha == 255 (Ces valeurs sont composées - je ne suis pas sur le léopard des neiges en ce moment. Ils sont à peu près typiques de ce que je recevais - toujours définitivement 'Rouge' mais difficile à corréler avec (1.0,0,0). Semblable pour les autres couleurs aussi sauf (1,0,1.0,1.0) serait exactement (255,255,255) et (0,0,0) serait exactement (0,0,0)).

J'ai essayé d'autres colorSpaces mais une chose similaire se produit. Toute aide ou pointeur est très appréciée, merci.

MISE À JOUR je crois que cela démontre ce que je suis au sujet de ..

//create 
NSUInteger arbitraryPixSize = 10; 
size_t components = 4; 
size_t bitsPerComponent = 8; 
size_t bytesPerRow = (arbitraryPixSize * bitsPerComponent * components + 7)/8; 
size_t dataLength = bytesPerRow * arbitraryPixSize; 
UInt32 *bitmap = malloc(dataLength); 
memset(bitmap, 0, dataLength); 

CGColorSpaceRef colSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); 

CGContextRef context = CGBitmapContextCreate (          bitmap, arbitraryPixSize, arbitraryPixSize,             bitsPerComponent,bytesPerRow,           colSpace, kCGImageAlphaPremultipliedFirst); 

CGContextSetFillColorSpace(context, colSpace); 
CGContextSetStrokeColorSpace(context, colSpace); 

// -- draw something 
CGContextSetRGBFillColor(context, 1.0f, 0.0f, 0.0f, 1.0f); 
CGContextFillRect(context, CGRectMake(0, 0, arbitraryPixSize, arbitraryPixSize)); 

// test the first pixel 
UInt8 *baseAddr = (UInt8 *)CGBitmapContextGetData(context); 
UInt8 alpha = baseAddr[0]; 
UInt8 red = baseAddr[1]; 
UInt8 green = baseAddr[2]; 
UInt8 blue = baseAddr[3]; 

CGContextRelease(context); 
CGColorSpaceRelease(colSpace); 

RÉSULTATS

Leopard -> == rouge 255, vert == 0, == 0 bleu, alpha == 255

léopard des neiges -> == rouge 228, vert == 29, == bleu 29, alpha == 255

+0

Veuillez ajouter le code entièrement compilable et vérifiable à cette question. La partie avec le problème n'est probablement pas discutée ici. – Ken

+0

ok, pourrait prendre un peu de temps pour extraire. J'apprécierais vraiment si vous pouviez vérifier dans un petit moment .. –

Répondre

3

Jetez un oeil à la documentation pour CGContextSetRGBFillColor.

CGContextSetRGBFillColor Définit la couleur de remplissage actuel à une valeur dans l'espace colorimétrique DeviceRGB .

Vous vouliez que vos composants soient en rapport avec l'espace RVB générique. Donc, utilisez l'une des autres méthodes de définition de la couleur de remplissage.

+1

merci, donc juste pour l'enregistrement que j'ai utilisé \t CGColorRef redCol = CGColorCreateGenericRGB (1.0f, 0.0f, 0.0f, 1.0f); \t CGContextSetFillColorWithColor (context, redCol); –

+0

jib: N'oubliez pas de libérer 'redCol' avec' CFRelease' ou 'CGColorRelease'. –