La route Core Image serait le plus fiable. En fait, ce n'est pas très compliqué, j'ai posté un exemple ci-dessous. Si vous savez qu'aucune de vos images ne sera retournée, vous pouvez supprimer le code de transformation. La principale chose à faire est que la conversion de NSImage
à CIImage
peut être coûteuse en termes de performances, vous devez donc veiller à mettre en cache le CIImage
si possible et ne pas le recréer lors de chaque opération de dessin.
CIImage* ciImage = [[CIImage alloc] initWithData:[yourImage TIFFRepresentation]];
if ([yourImage isFlipped])
{
CGRect cgRect = [ciImage extent];
CGAffineTransform transform;
transform = CGAffineTransformMakeTranslation(0.0,cgRect.size.height);
transform = CGAffineTransformScale(transform, 1.0, -1.0);
ciImage = [ciImage imageByApplyingTransform:transform];
}
CIFilter* filter = [CIFilter filterWithName:@"CIColorInvert"];
[filter setDefaults];
[filter setValue:ciImage forKey:@"inputImage"];
CIImage* output = [filter valueForKey:@"outputImage"];
[output drawAtPoint:NSZeroPoint fromRect:NSRectFromCGRect([output extent]) operation:NSCompositeSourceOver fraction:1.0];
Remarque: libérer/conserver la gestion de la mémoire est laissé à titre d'exercice, le code ci-dessus suppose la récupération de place.
Si vous voulez rendre l'image à une taille arbitraire, vous pouvez effectuer les opérations suivantes:
NSSize imageSize = NSMakeSize(1024,768); //or whatever size you want
[yourImage setSize:imageSize];
[yourImage lockFocus];
NSBitmapImageRep* bitmap = [[NSBitmapImageRep alloc] initWithFocusedViewRect:NSMakeRect(0, 0, imageSize.width, imageSize.height)];
[yourImage unlockFocus];
CIImage* image = [CIImage imageWithData:[bitmap TIFFRepresentation]];
Merci, qui ne résout le problème d'inversion des couleurs. Malheureusement, cela ne me donne pas la pleine résolution: il semble que la TIFFRprésentation initiale est beaucoup plus petite que la taille que je veux en tirer. Comment puis-je m'assurer d'obtenir les données à haute résolution? – smartgo
Vous pouvez créer un 'NSBitmapImageRep' à partir du' NSImage' en utilisant la taille que vous voulez et ensuite créer le 'CIImage' de l'image bitmap, voir ici: http://pastie.org/798088 –
Parfait, merci beaucoup! – smartgo