【问题标题】:Converting UIImage to UIData in monotouch fails在 monotouch 中将 UIImage 转换为 UIData 失败
【发布时间】:2014-03-08 16:03:59
【问题描述】:

我看到了关于堆栈溢出的各种问题,但没有任何对我有用的答案。我正在尝试将通过 UIImagePickerController 检索的图像转换为 NSData 对象。在我调用 AsJPEG 之后的调试器中,NSData 对象的文本显示为...

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

(注意调试器会切断字符串)

我的代码相当简单(在堆栈溢出时取样本)

    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);
    }

我看到其他帖子表明它是 UIImage 的大小,所以我尝试裁剪它。结果相同。我也尝试过 AsPNG,结果相同。我什至尝试将图像缩小到原始大小的 1/4,但仍然出现错误。

我认为关键是提到了 NSString,它告诉我有些东西很可疑……因为 Xcode 中使用的本机 C 调用不涉及 NSString,所以我认为还有其他事情发生。

有什么建议吗?

【问题讨论】:

  • 你遇到崩溃了吗?还是只是您担心的调试器?为什么你使用'Marshal.Copy' 而不是简单的'NSData.Save()':imgData.Save(pngFilename, false, out error) - 这应该完美地将你的图像作为PNG保存到磁盘。 NSString 的问题可能仅出在调试器上,它试图向您展示 NSData 对象的人类可读表示。
  • 所以我的问题是 NSData 对象无效。一旦你有一个有效的 NSData 对象,你的建议似乎是另一种保存方法。
  • 你没有回答我的问题:你为什么认为你的 NSData 无效?您的应用程序在调试时是否崩溃?或者在评估您的 NSData 对象时,调试器的输出是否存在上述异常?如果您正在调试并且它崩溃并且您看不到完整的异常,请使用“立即”窗口并输入 $exception 并将结果粘贴到此处。
  • 很公平。所以在即时窗口中输入 $exception 我得到“评估失败”。我认为存在问题的原因是,在调试器中,Value 字段显示字符串“System.Exception:无法初始化“MonoTouch.Foundation.NSString”类型的实例:NSData 字段的本机“initWithDa…”。该应用在调试器中运行时不会崩溃。
  • @BryantHarris 您在调试器窗口中看到的异常是调试器的问题。我假设它看起来像这样:screencast.com/t/6CE8xLaknrIC NSData 不包含字符串,这也是调试器尝试转换的字符串。这应该很快在较新的版本中得到修复。此外,这也是类似的:bugzilla.xamarin.com/show_bug.cgi?id=17693。但问题仍然存在:问题是什么?检查 imageData 时向您显示该异常的调试器窗口可能是红鲱鱼。

标签: xamarin.ios uiimage xamarin uiimagepickercontroller nsdata


【解决方案1】:

正如 therealjohn 的评论中所述,当调试器将值转换为字符串以将其显示在调试器窗口中时,这似乎是一个错误,它似乎遇到了错误。 NSData 对象其实很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    相关资源
    最近更新 更多