如何在 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);
我有以下 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 中搜索了 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);