【发布时间】: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