繁体   English   中英

在 C# 中从 DataUrl 转换为图像并使用字节写入文件

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

你好,我有这样的签名:

在此处输入图片说明

它被编码为 DataUrl,特别是这个字符串:

“数据:图像/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAADICAYAAADGFbfiAAAYlElEQVR4Xu2dC8w1R1nHQSCIgIKVGLmoiLciFwUs...(长字符串)”

我想要做的是将此 DataUrl 转换为 PNG 图像,并将图像保存到设备,这是我目前正在做的事情:

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

但是我的代码使我的应用程序在这一行中特别崩溃:

File.WriteAllBytes(filename, binData);

我用作参考的示例 ( Link ) 使用的是 PictureBox,但在 Xamarin 中没有使用图片框。

有任何想法吗?

正如@SLaks 提到的,我不需要 MemoryStream,我的代码的问题是路径和文件名以获得进一步帮助,这是工作代码:

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

图像显示:

在此处输入图片说明

我刚刚清理了马里奥的代码并微调了正则表达式:

public string SaveDataUrlToFile(string dataUrl, string savePath)
{
    var matchGroups = Regex.Match(dataUrl, @"^data:((?<type>[\w\/]+))?;base64,(?<data>.+)$").Groups;
    var base64Data = matchGroups["data"].Value;
    var binData = Convert.FromBase64String(base64Data);
    System.IO.File.WriteAllBytes(savePath, binData);
    return savePath;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM