コア イメージ ルートが最も信頼性が高くなります。実際にはそれほど複雑ではありません。以下にサンプルを投稿しました。画像が反転しないことがわかっている場合は、変換コードを削除できます。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]];