I've seen variations of my questions on stack overflow but haven't had any answers that have worked for me. I'm trying to convert an image I retrieve via UIImagePickerController to an NSData object. In the debugger after I call AsJPEG the NSData object has text that appears as...

System.Exception: Could not initialize an instance of the type 'MonoTouch.Foundation.NSString': the native 'initWithDa…

(note the debugger cuts off the string)

My code is fairly straight forward (taken form samples on stack overflow)

    protected void Handle_FinishedPickingMedia (object sender, UIImagePickerMediaPickedEventArgs e) {
        // determine what was selected, video or image
        bool isImage = false;
        switch(e.Info[UIImagePickerController.MediaType].ToString()) {
        case "public.image":
            Console.WriteLine("Image selected");
            isImage = true;
            break;
        case "public.video":
            Console.WriteLine("Video selected");
            break;
        }

        string path = Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
        path = Path.Combine (path, "media");
        if (!Directory.Exists (path))
            Directory.CreateDirectory (path);
        path = Path.Combine (path, Path.GetRandomFileName ());

        // get common info (shared between images and video)
        NSUrl referenceURL = e.Info[new NSString("UIImagePickerControllerReferenceUrl")] as NSUrl;
        if (referenceURL != null)
            Console.WriteLine("Url:"+referenceURL.ToString ());

        // if it was an image, get the other image info
        if(isImage) {
            // get the original image
            UIImage originalImage = e.Info[UIImagePickerController.OriginalImage] as UIImage;

            if(originalImage != null) {
                // do something with the image
                Console.WriteLine ("got the original image");

                using (NSData imageData = originalImage.AsJPEG(0.75f)) {
                    byte[] dataBytes = new byte[imageData.Length];
                    System.Runtime.InteropServices.Marshal.Copy(imageData.Bytes, dataBytes, 0, Convert.ToInt32(imageData.Length));
                    File.WriteAllBytes (path, dataBytes);
                }
            }
        } else { // if it's a video
            // get video url
            NSUrl mediaURL = e.Info[UIImagePickerController.MediaURL] as NSUrl;
            if(mediaURL != null) {
                // ...
            }
        }          

        // dismiss the picker
        NavigationController.DismissViewController (true, null);
    }

I've seen other posts that suggested it was the size of the UIImage, so I've experimented with cropping it. Same result. I've also tried AsPNG, same result. I even tried scaling down the image to 1/4 it's original size and still get the error.

I think the key is the mention of NSString, which tells me something's fishy... as the native C call used in Xcode doesn't involve an NSString, so I think something else is going on.

Any suggestions?

有帮助吗?

解决方案

As noted in the comment from therealjohn, this appears to be an error with the debugger when it converts a value to a string to display it in the debugger window it seems to run into an error. The NSData object is actually fine.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top