Маршрут Core Image будет наиболее надежным. Это на самом деле не очень сложно, я разместил образец ниже. Если вы знаете, что ни одно из ваших изображений не будет перевернуто, вы можете удалить код преобразования. Главное, на что следует обратить внимание, это то, что преобразование NSImage
в CIImage
может быть дорогостоящим с точки зрения производительности, поэтому вы должны убедиться, что вы кэшируете CIImage
, если это возможно, и не создавайте его заново при каждой операции рисования. .
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];
Примечание: управление освобождением / сохранением памяти оставлено в качестве упражнения, код выше предполагает сборку мусора.
Если вы хотите визуализировать изображение произвольного размера, вы можете сделать следующее:
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]];