トリミングした画像をカメラロールに保存しようとしています。
(プログラムで行う必要があります。ユーザーに編集させることはできません)
これは私の(まだ非常に基本的な)カットアンドセーブコードです:
- (void)cutAndSaveImage:(UIImage*)rawImage
{
CIImage *workingImage = [[CIImage alloc] initWithImage:rawImage];
CGRect croppingRect = CGRectMake(0.0f, 0.0f, 3264.0f, 1224.0f);
CIImage *croppedImage = [workingImage imageByCroppingToRect:croppingRect];
UIImage *endImage = [UIImage imageWithCIImage:croppedImage scale: 1.0f orientation:UIImageOrientationRight];
self.testImage.image = endImage;
UIImageWriteToSavedPhotosAlbum(rawImage, self, @selector(image:didFinishSavingWithError:contextInfo:) , nil);
UIImageWriteToSavedPhotosAlbum(endImage, self, @selector(image:didFinishSavingWithError:contextInfo:) , nil);
}
メソッドは次の場所で呼び出されます。
- (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info
- 最初
CIImageに raw を使用して を作成しますUIImage。 CIImage次に、最初のメソッドのインスタンス メソッドを使用し てクロップします。- その後
UIImage、切り取った CIImage を使用して新しいものを作成します。
この時点で、いくつかのフィードバックを得るために、新しいトリミングUIImageを a のバッキング イメージとして設定しましたUIImageView。これは機能し、希望どおりに画像がトリミングされていることがはっきりとわかります。
ただし、カメラロールに保存しようとすると、動作が停止します。
新しく作成した を保存できませんendImage。
ご覧のとおりUIImage、比較のために、オリジナルも保存する行を追加しました。元のものは正常に保存されます。
もう 1 つの紛らわしい点はNSError、コールバックに渡されるオブジェクトimage:didFinishSavingWithError:contextInfo:が nil であることです。(コールバックは通常、両方の保存試行に対して実行されます)
編集:実験を行いました:
NSLog(@"rawImage: %@ - rawImage.CGImage: %@", rawImage, rawImage.CGImage);
NSLog(@"endImage: %@ - endImage.CGImage: %@", endImage, endImage.CGImage);
rawImage( からのUIImagePickerController) だけが裏づけを持っているように見えますCGImageRef。から作成されたもう一方はCIImage、そうではありません。
UIImageWriteToSavedPhotosAlbumバッキングを使用して機能することはできますCGImageRefか?