0

CIImageのImageByCroppingToRect関数を使用して、元々UIImageであった画像をトリミングしています。作物は機能します。「originalImage.AsJPEG()。Save」を実行すると、同様に機能します。保存するファイルが機能するJPEGであることをテストし、確認しました。しかし、「croppedImage.AsJPEG()。Save」を実行すると、その行に「System.NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが表示されます。originalImageとcroppedImageはどちらもUIImagesです。唯一の違いは、croppedImageがトリミングを行った変換済みCIImageから発生したことです...しかし、なぜこのエラーが発生するのでしょうか。これはUIImageなので、機能するはずですよね?そして、「view.Image = CroppedImage;」という行があるため、croppedImageの画像が存在することを私は知っています。

以下はソースコードであり、このリンクはjpg画像を含む実際のプロジェクトです: https ://www.dropbox.com/s/erh0yrew8pyuye7/TestImageCrop.zip

        // Create an image from a file
        UIImage originalImage = UIImage.FromFile("IMG_0072.jpg");

        // Create a UIImageView
        UIImageView view = new UIImageView(new RectangleF(0,0,300,300));
        this.View.AddSubview(view);

        // Crop the image using CIImage's ImageByCroppingToRect function
        CIImage testCIImage = new CIImage(originalImage).ImageByCroppingToRect(new RectangleF(0,0,500,500));
        UIImage croppedImage = new UIImage(testCIImage);
        view.Image = croppedImage;


        // Store the image to a file
        string Path = Environment.GetFolderPath ( Environment.SpecialFolder.MyDocuments ) + "/";
        NSError err = new NSError();
        originalImage.AsJPEG().Save(Path+"originalImage.jpg", true, out err);
        // Here is where the error is happening.  If I save the originalImage as a JPEG, it works just fine.
        // But if I save the croppedImage as a JPEG, it errors out saying "System.NullReferenceException: Object reference not set to an instance of an object" 
        croppedImage.AsJPEG().Save(Path+"croppedImage.jpg", true, out err);
4

1 に答える 1

1

私はあなたが遭遇している問題はドキュメントのこのメモだと思います:

画像にデータがない場合、または基になるCGImageRefにサポートされていないビットマップ形式のデータが含まれている場合、この関数はnilを返すことがあります。

Core Image関数を使用する前にこれに遭遇したことを覚えているようですが、取引が何であるか正確にはわかりません。代わりに、コアグラフィックを使用してトリミングすると正常に機能します。

    // crop using core graphics instead of CIImage
    SizeF newSize = new SizeF(500,500);
    UIGraphics.BeginImageContextWithOptions(size:newSize, opaque:false, scale:0.0f);
    originalImage.Draw (new RectangleF(0,0,originalImage.Size.Width,originalImage.Size.Height));
    UIImage croppedImage = UIGraphics.GetImageFromCurrentImageContext();
    UIGraphics.EndImageContext();
于 2013-02-04T17:43:45.703 に答える