0

Я видел варианты моих вопросов о переполнении стека, но у меня не было никаких ответов, которые сработали для меня. Я пытаюсь преобразовать изображение, которое я получаю через 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, поэтому я думаю, что происходит что-то еще.

Любые предложения?

+1

Вы попали в аварию? Или это просто отладчик, о котором вы беспокоитесь? Почему вы используете «Marshal.Copy» вместо просто «NSData.Save()»: 'imgData.Save (pngFilename, false, out error)' - это должно идеально сохранять ваше изображение на диск как PNG. Проблема с 'NSString', вероятно, связана с отладчиком только тогда, когда она пытается показать вам читаемое человеком представление объекта NSData. – Krumelur

+0

Итак, мой вопрос в том, что объект NSData недействителен. Ваше предложение похоже на альтернативный метод для сохранения, когда у вас есть действительный объект NSData. –

+0

Вы не отвечаете на мой вопрос: почему, по вашему мнению, ваши NSData недействительны? Ваше приложение разбивается и ломается во время отладки? Или это вышеописанное исключение из вывода отладчика при оценке вашего объекта NSData? Если вы отлаживаете и сбой, и вы не можете увидеть полное исключение, используйте окно «Немедленное» и введите «$ exception» и вставьте здесь результат. – Krumelur

ответ

0

Как отмечено в комментарии от thealjohn, это, по-видимому, является ошибкой с отладчиком, когда оно преобразует значение в строку, чтобы отобразить его в окне отладчика, похоже, что оно запущено в ошибке. Объект NSData на самом деле прекрасен.

Смежные вопросы