Changed Richard code. TryParse return bool and added imageType, because I dont see usage for mimeType
public sealed class DataImage
{
private static readonly Regex DataUriPattern = new Regex(@"^data\:(?<mimeType>image\/(?<imageType>png|tiff|jpg|gif));base64,(?<data>[A-Z0-9\+\/\=]+)$", RegexOptions.Compiled | RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase);
private DataImage(string mimeType, string imageType, byte[] rawData)
{
MimeType = mimeType;
RawData = rawData;
ImageType = imageType;
}
public string MimeType { get; }
public byte[] RawData { get; }
public string ImageType { get; }
public Image Image => Image.FromStream(new MemoryStream(RawData));
public static bool TryParse(string dataUri, out DataImage image)
{
image = null;
if (string.IsNullOrWhiteSpace(dataUri)) return false;
Match match = DataUriPattern.Match(dataUri);
if (!match.Success) return false;
string mimeType = match.Groups["mimeType"].Value;
string imageType = match.Groups["imageType"].Value;
string base64Data = match.Groups["data"].Value;
try
{
byte[] rawData = Convert.FromBase64String(base64Data);
image = rawData.Length == 0 ? null : new DataImage(imageType, rawData);
return true;
}
catch (FormatException)
{
return false;
}
}
}
usage:
if (DataImage.TryParse(propertyValue, out var imageData))
{
picture = imageData.RawData;
}