2014-12-30 11 views
8

Ciao Ho la firma in questo modo:Convertire da un DataURL a un'immagine in C# e scrivere un file con il byte

enter image description here

che è codificato ad un DataURL specificamente questa stringa:

"dati: image/png; Base64, iVBORw0KGgoAAAANSUhEUgAAAZAAAADICAYAAADGFbfiAAAYlElEQVR4Xu2dC8w1R1nHQSCIgIKVGLmoiLciFwUs ... (lunga stringa)"

Quello che voglio fare è questo Convertire DataURL a un PNG Ima ge, e salvare l'immagine sul dispositivo, questo è quello che sto facendo finora:

if (newItem.FieldType == FormFieldType.Signature) 
{ 
    if (newItem.ItemValue != null) 
    { 
      //string completeImageName = Auth.host + "/" + li[i]; 
      string path; 
      string filename; 
      string stringName = newItem.ItemValue; 

      var base64Data = Regex.Match(stringName, @"data:image/(?<type>.+?),(?<data>.+)").Groups["data"].Value; 
      var binData = Convert.FromBase64String(base64Data); 

      path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 

      filename = Path.Combine(path, base64Data); 

      if (!File.Exists(filename)) 
      { 
       using (var stream = new MemoryStream(binData)) 
       { 
//Code crashing here-------------------------- 
         File.WriteAllBytes(filename, binData); 
        } 
      } 

     newItem.ItemValue = filename; 

    } 
} 

     App.Database.SaveReportItem(newItem); 

Ma il mio codice sta facendo la mia domanda il crash in particolare in questa linea:

File.WriteAllBytes (nome del file, BinData);

L'esempio che sto utilizzando come riferimento (Link) utilizza un PictureBox ma con Xamarin non è possibile utilizzare PictureBox.

Qualsiasi idea?

+0

Che errore ottieni? – SLaks

+0

Perché stai creando un MemoryStream? – SLaks

+0

Arresto anomalo su iOS o Android? E, chiedi a SLaks, perché aprire un flusso e non usarlo? Sei sicuro che il tuo nome file sia impostato su un valore valido? – Jason

risposta

8

Come @SLaks menzionati non ho bisogno di un MemoryStream, il problema con il mio codice è stato il percorso e il nome del file per ulteriori informazioni questo è il codice di lavoro:

if (newItem.FieldType == FormFieldType.Signature) 
{ 
    if (newItem.ItemValue != null) 
    { 
     //string completeImageName = Auth.host + "/" + li[i]; 
     string path; 
     string filename; 
     string stringName = newItem.ItemValue; 

     var base64Data = Regex.Match(stringName, @"data:image/(?<type>.+?),(?<data>.+)").Groups["data"].Value; 
     var binData = Convert.FromBase64String(base64Data); 

     path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 

     //filename = Path.Combine(path, base64Data.Replace(@"/", string.Empty)); 

     long milliseconds = DateTime.Now.Ticks/TimeSpan.TicksPerMillisecond; 
     string fileName = "Sn" + milliseconds.ToString() + ".PNG"; 
     filename = Path.Combine(path, fileName); 

     if (!File.Exists(filename)) 
     { 
      //using (var stream = new MemoryStream(binData)) 
      //{ 
       File.WriteAllBytes(filename, binData); 
      //} 
     } 

     newItem.ItemValue = filename; 

    } 
} 

App.Database.SaveReportItem(newItem); 

E l'immagine ha mostrato:

enter image description here

Problemi correlati