を実行すると、ディスクから.jpgファイルをロードして操作します。これを.pngファイルとしてディスクに書き込む必要があります。どうやってそれができる?CGImageRefをpngファイルに保存しますか?私のCocoaアプリケーションで
ありがとうございました!
を実行すると、ディスクから.jpgファイルをロードして操作します。これを.pngファイルとしてディスクに書き込む必要があります。どうやってそれができる?CGImageRefをpngファイルに保存しますか?私のCocoaアプリケーションで
ありがとうございました!
CGImageDestination
を作成し、作成するファイルのタイプとしてkUTTypePNG
を渡します。画像を追加してから目的地を確定します。
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;
}
あなたは、あなたのプロジェクトにImageIO
とCoreServices
(または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)
}
時間とメモリの両方に関して、これらのどれがより効率的であるかについての詳細はありますか?ありがとうございました。 –
パフォーマンス情報で私の答えを更新しました:) –
ivanceras:http://developer.apple.com/mac/library/documentation/GraphicsImaging/Reference/CGImageDestination/したい場合はここで –
ちょうどメモ。ドキュメントが 'ApplicationServices/ImageIO'にあると言っても関数を参照するために' ImageIO.framework'を追加しなければなりません。 – Eonil
@ Eonil:それはあなたが構築しているプラットフォームによって異なります。 Cocoa Touchには傘のフレームワークがないため、iOS向けにビルドする場合はImageIOと直接リンクする必要があります。 Mac OS X用にビルドするときは、ApplicationServicesにリンクし、その中のすべてを取得します。 –