2011-05-31 5 views
1

Je suis en train de manipuler des pixels pour faire tourner les niveaux de gris et tout apparaît bien, sauf en bas de l'image j'ai des pixels de couleur bleue. Cela apparaît plus petit dans les dimensions de l'image et disparaît après un certain point. Quelqu'un peut-il voir ce que je fais mal?CoreGraphics Pixel Manipulation Blue

CGImageRef imageRef = image.CGImage; 

NSUInteger width = CGImageGetWidth(imageRef); 
NSUInteger height = CGImageGetHeight(imageRef); 
CFDataRef dataref = CopyImagePixels(imageRef); 

unsigned char *rawData = (unsigned char *)CFDataGetBytePtr(dataref); 

int byteIndex = 0; 

for (int ii = 0 ; ii < width * height ; ++ii) 

{ 

    int red = (int)rawData[byteIndex]; 
    int blue = (int)rawData[byteIndex+1]; 
    int green = (int)rawData[byteIndex+2]; 

    int r, g, b; 

    r = (int)(red * 0.30) + (green * 0.59) + (blue * 0.11); 
    g = (int)(red * 0.30) + (green * 0.59) + (blue * 0.11); 
    b = (int)(red * 0.30) + (green * 0.59) + (blue * 0.11); 


    rawData[byteIndex] = clamp(r, 0, 255); 
    rawData[byteIndex+1] = clamp(g, 0, 255); 
    rawData[byteIndex+2] = clamp(b, 0, 255); 
    rawData[byteIndex+3] = 255; 

    byteIndex += 4; 

} 



CGContextRef ctx = CGBitmapContextCreate(rawData, 
             CGImageGetWidth(imageRef), 
             CGImageGetHeight(imageRef), 
             CGImageGetBitsPerComponent(imageRef), 
             CGImageGetBytesPerRow(imageRef), 
             CGImageGetColorSpace(imageRef), 
             kCGImageAlphaPremultipliedLast); 


imageRef = CGBitmapContextCreateImage (ctx); 
CFRelease(dataref); 
UIImage* rawImage = [UIImage imageWithCGImage:imageRef]; 
CGImageRelease(imageRef); 
CGContextRelease(ctx); 

Exemple de problème: http://iforce.co.nz/i/3rei1wba.utm.jpg

+0

règle # 0: ne rejettera const: 'unsigned char * rawData = (unsigned char *) CFDataGetBytePtr (dataref);' – justin

Répondre

1

Le problème est je suppose CGImageGetWidth(imageRef) == CGImageGetBytesPerRow(imageRef) - ce qui est pas toujours le cas. Cela a été souligné sur les forums de développeurs Apple et est correct. J'ai changé pour utiliser la longueur du dataref et maintenant cela fonctionne comme prévu.

NSUInteger length = CFDataGetLength(dataref); 
1

Il y a une raison pour laquelle personne n'a répondu - le code affiché dans votre question semble tout à fait bien!

J'ai fait un projet de test ici: https://github.com/oneblacksock/stack_overflow_answer_6188863 et quand je le lance avec votre code, ça fonctionne parfaitement!

Les seuls bits qui sont différents de votre problème sont les fonctions CopyPixelData et pince - peut-être votre problème est dans ceux-ci? Téléchargez mon projet de test et voyez ce que j'ai fait - essayez-le avec une image que vous savez cassée et laissez-moi savoir comment vous allez!

Sam

+0

Merci pour cela, il est en fait une question que je l'ai mentionné dans une réponse. – David

+0

Ah, c'est intéressant - je ne savais pas que ça donnait parfois des réponses étranges :) – deanWombourne