Search code examples
c#.netxamarinmemorystreamxamarin.forms

Convert from a DataUrl to an Image in C# and write a file with the bytes


Hello I have signature like this:

enter image description here

which is encoded to a Data Url specifically this string:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAADICAYAAADGFbfiAAAYlElEQVR4Xu2dC8w1R1nHQSCIgIKVGLmoiLciFwUs... (long string)

What i want to do is Convert this Data Url to an PNG Image, and save the image to the device, this is what i am doing so far:

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

But my code is making my application to crash specifically in this line:

File.WriteAllBytes(filename, binData);

The sample I am using as reference (Link) is using a PictureBox but with Xamarin there is no use of a pictureBox.

Any Ideas?


Solution

  • As @SLaks mentioned I didn't need a MemoryStream, the problem with my code was the path and the filename for further help this is the working code:

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

    And the image showed:

    enter image description here