如何在 C# 中从 base 64 图像中删除 header?

How to strip out header from base 64 image in C#?

我有以下 base 64 图像:

var image='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA0gA...';

我正在使用 Convert.FromBase64String() 将其转换为字节:

 byte[] bytes = Convert.FromBase64String(convert);

但在此之前,我需要去掉 Base 64 字符串的 header(即 data:image/png;base64)。我正在使用:

string convert = image.Replace("data:image/png;base64,", string.Empty);

我可以分别为所有图像扩展编写相同的语句,但这些图像非常大,扫描每个图像似乎效率低下。

我在 PHP 中搜索了 solution which uses regular expression in PHP to cut off the header part, while other 答案,使用的是内置方法 get_contents

我的问题是:在 C# 中是否有任何内置方法可以仅获取 base 64 url 的内容?如果没有,那么是否有任何通用的方法可以去除所有扩展名的 header?

您可以使用String.Split方法。

String[] substrings = image.Split(',');

string header = substrings[0];
string imgData = substrings[1]; 

byte[] bytes = Convert.FromBase64String(imgData);

更新

出于好奇,我写了一个测试哪种方法最快。

using System;
using System.Text.RegularExpressions;

namespace StackOwerflow
{
    public class Program
    {
        static public void Main()
        {
            int repeats = 10000;

            string imgStr = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAB0IAAAQ4CAIAA...eXiM/H/wAAAABJRU5ErkJggg=="; //146 kb img file
            string r = string.Empty;

            var watch = System.Diagnostics.Stopwatch.StartNew();
            for (int i = 0; i < repeats; i++)
            {
                r = RegExMethod(imgStr);
            }
            watch.Stop();
            var elapsedMs = watch.ElapsedMilliseconds;

            Console.WriteLine("RegEx time: {0} Ms", elapsedMs);

            watch = System.Diagnostics.Stopwatch.StartNew();
            for (int i = 0; i < repeats; i++)
            {
                r = SubStringMethod(imgStr);
            }
            watch.Stop();
            elapsedMs = watch.ElapsedMilliseconds;

            Console.WriteLine("SubString time: {0} Ms", elapsedMs);

            watch = System.Diagnostics.Stopwatch.StartNew();
            for (int i = 0; i < repeats; i++)
            {
                r = SplitMethod(imgStr);
            }
            watch.Stop();
            elapsedMs = watch.ElapsedMilliseconds;

            Console.WriteLine("Split time: {0} Ms", elapsedMs);

            Console.ReadKey();
        }

        public static string RegExMethod(string img)
        {
            return Regex.Replace(img, @"^data:image\/[a-zA-Z]+;base64,", string.Empty);
        }

        public static string SubStringMethod(string img)
        {
            return img.Substring(img.IndexOf(",") + 1);
        }

        public static string SplitMethod(string img)
        {
            return img.Split(',')[1];
        }

    }
}

对于我的机器结果:

RegEx time: 1022 Ms

SubString time: 1188 Ms

Split time: 5255 Ms

获胜者是 RegEx。

您可以尝试这样的操作:

string result = Regex.Replace(image, @"^data:image\/[a-zA-Z]+;base64,", string.Empty);

这应该能捕捉到不同的扩展名。我还没有测试过这个,所以它可能需要一些摆弄。

由于您知道字符串中 , 的唯一实例将是前导码和数据之间的分隔符,因此您可以在没有正则表达式的情况下这样做:

string convert = image.Substring(image.IndexOf(",") + 1);