Я видел варианты моих вопросов о переполнении стека, но у меня не было никаких ответов, которые сработали для меня. Я пытаюсь преобразовать изображение, которое я получаю через UIImagePickerController, к объекту NSData. В отладчике после я называю AsJPEG объект NSData имеет текст, который выглядит как ...Преобразование UIImage в UIData в monotouch не удается
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, которое говорит мне что-то подозрительное ... поскольку собственный вызов C, используемый в Xcode, не связан с NSString, поэтому я думаю, что происходит что-то еще.
Любые предложения?
Вы попали в аварию? Или это просто отладчик, о котором вы беспокоитесь? Почему вы используете «Marshal.Copy» вместо просто «NSData.Save()»: 'imgData.Save (pngFilename, false, out error)' - это должно идеально сохранять ваше изображение на диск как PNG. Проблема с 'NSString', вероятно, связана с отладчиком только тогда, когда она пытается показать вам читаемое человеком представление объекта NSData. – Krumelur
Итак, мой вопрос в том, что объект NSData недействителен. Ваше предложение похоже на альтернативный метод для сохранения, когда у вас есть действительный объект NSData. –
Вы не отвечаете на мой вопрос: почему, по вашему мнению, ваши NSData недействительны? Ваше приложение разбивается и ломается во время отладки? Или это вышеописанное исключение из вывода отладчика при оценке вашего объекта NSData? Если вы отлаживаете и сбой, и вы не можете увидеть полное исключение, используйте окно «Немедленное» и введите «$ exception» и вставьте здесь результат. – Krumelur