2009-08-24 23 views

答えて

13

CGImageDestinationを作成し、作成するファイルのタイプとしてkUTTypePNGを渡します。画像を追加してから目的地を確定します。

+0

ivanceras:http://developer.apple.com/mac/library/documentation/GraphicsImaging/Reference/CGImageDestination/したい場合はここで –

+0

ちょうどメモ。ドキュメントが 'ApplicationServices/ImageIO'にあると言っても関数を参照するために' ImageIO.framework'を追加しなければなりません。 – Eonil

+1

@ Eonil:それはあなたが構築しているプラ​​ットフォームによって異なります。 Cocoa Touchには傘のフレームワークがないため、iOS向けにビルドする場合はImageIOと直接リンクする必要があります。 Mac OS X用にビルドするときは、ApplicationServicesにリンクし、その中のすべてを取得します。 –

89

CGImageDestinationを使用し、kUTTypePNGを使用することが正しいアプローチです。ここでは簡単の抜粋です:

@import MobileCoreServices; // or `@import CoreServices;` on Mac 
@import ImageIO; 

BOOL CGImageWriteToFile(CGImageRef image, NSString *path) { 
    CFURLRef url = (__bridge CFURLRef)[NSURL fileURLWithPath:path]; 
    CGImageDestinationRef destination = CGImageDestinationCreateWithURL(url, kUTTypePNG, 1, NULL); 
    if (!destination) { 
     NSLog(@"Failed to create CGImageDestination for %@", path); 
     return NO; 
    } 

    CGImageDestinationAddImage(destination, image, nil); 

    if (!CGImageDestinationFinalize(destination)) { 
     NSLog(@"Failed to write image to %@", path); 
     CFRelease(destination); 
     return NO; 
    } 

    CFRelease(destination); 
    return YES; 
} 

あなたは、あなたのプロジェクトにImageIOCoreServices(またはiOS上MobileCoreServices)を追加してヘッダをインクルードする必要があります。


あなたがiOS版にしていると、あなたは単純なアプローチを使用することができ、あまりにもMac上で動作するソリューションを必要としない場合は:私のテストでは

// `image` is a CGImageRef 
// `path` is a NSString with the path to where you want to save it 
[UIImagePNGRepresentation([UIImage imageWithCGImage:image]) writeToFile:path atomically:YES]; 

を、ImageIOにアプローチはしていました私のiPhone 5ではUIImageのアプローチよりも10%高速です。シミュレータでは、UIImageの方が高速でした。実際にパフォーマンスに関心がある場合は、デバイス上の特定の状況についてそれぞれをテストする価値があります。

@discardableResult func writeCGImage(_ image: CGImage, to destinationURL: URL) -> Bool { 
    guard let destination = CGImageDestinationCreateWithURL(destinationURL as CFURL, kUTTypePNG, 1, nil) else { return false } 
    CGImageDestinationAddImage(destination, image, nil) 
    return CGImageDestinationFinalize(destination) 
} 
+0

時間とメモリの両方に関して、これらのどれがより効率的であるかについての詳細はありますか?ありがとうございました。 –

+0

パフォーマンス情報で私の答えを更新しました:) –

16

は3 & 4の例では、スウィフトのMacOSフレンドリーれていますより具体的な答えは、より具体的な質問をする必要があります(別の質問として行うべきです)。
関連する問題