1

トリミングした画像をカメラロールに保存しようとしています。
(プログラムで行う必要があります。ユーザーに編集させることはできません)

これは私の(まだ非常に基本的な)カットアンドセーブコードです:

- (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か?

4

2 に答える 2

5

バッキング CGImageRef を使用して UIImageWriteToSavedPhotosAlbum が機能する可能性はありますか?

正しい。CIImage は画像ではなく、CIImage のみに基づく UIImage も画像ではありません。それは一種のラッパーです。なぜここで CIImage を使用しているのですか? CIFilter を使用していないため、これは意味がありません。または、CIFilter を使用している場合、CIContext を介してレンダリングし、出力をビットマップとして取得する必要があります。

小さいグラフィック コンテキストに描画することで、簡単に切り抜くことができます。

于 2013-05-06T14:48:09.667 に答える
2

UIImage オブジェクトが CIImage オブジェクトを使用して初期化された場合、プロパティの値は NULL です。

次のように CIImage から UIImage を生成できます。

let lecturePicture = UIImage(data: NSData(contentsOfURL: NSURL(string:"http://i.stack.imgur.com/Xs4RX.jpg")!)!)!
let controlsFilter = CIFilter(name: "CIColorControls")
controlsFilter.setValue(CIImage(image: lecturePicture), forKey: kCIInputImageKey)
controlsFilter.setValue(1.5, forKey: kCIInputContrastKey)
let displayImage = UIImage(CGImage: CIContext(options:nil).createCGImage(controlsFilter.outputImage, fromRect:controlsFilter.outputImage.extent()))!
displayImage
于 2015-05-21T08:46:37.740 に答える