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: -
- créer un contexte de bitmap avec une colorspace kCGColorSpaceGenericRGB
- mis fillColorSpace du contexte dans le même kCGColorSpaceGenericRGB colorspace
- fixé remplissage de couleur
- d'étirage du contexte
- 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
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
ok, pourrait prendre un peu de temps pour extraire. J'apprécierais vraiment si vous pouviez vérifier dans un petit moment .. –