我正在将一个字符串传递给具有图像src字节的控制器
例如。
src =“ data:image / png; base64,sdjsdfojsdf; l”;
在c#中,我有一个方法可以从字节[]中获取缩略图。
public static byte[] CreateImageThumbnail(byte[] image, int width, int height)
{
using (var stream = new System.IO.MemoryStream(image))
{
var img = Image.FromStream(stream);
var thumbnail = img.GetThumbnailImage(width, height, () => false, IntPtr.Zero);
using (var thumbStream = new System.IO.MemoryStream())
{
thumbnail.Save(thumbStream, System.Drawing.Imaging.ImageFormat.Jpeg);
return thumbStream.GetBuffer();
}
}
}
但是现在我希望能够在上面的示例中传递src字符串,然后返回一个新的src字符串作为压缩缩略图。
例如。
public static string CreateImageThumbnail(string src, int width, int height)
在'CreateImageThumbnail'方法之前或之后,我需要进行哪种类型的转换以传递src字符串或将src字符串转换为该方法前后的字节数组?
答案 0 :(得分:2)
假设输入字符串和输出字符串的格式应为"data:image/png;base64,<base64encoding>"
,则我们可以轻松提取基本64编码,然后转换为字节数组,然后使用现有方法对其进行压缩,然后转换回来。
public static string CreateImageThumbnail(string src, int width, int height)
{
if(src == null) throw new ArgumentNullException(nameof(src));
string base64Start = "data:image/png;base64,";
if(!src.StartsWith(base64Start)) throw new ArgumentException("wrong format", nameof(src));
string base64Input = src.Substring(base64Start.Length).Trim();
byte[] imageData = Convert.FromBase64String(base64Input);
byte[] outputData = CreateImageThumbnail(imageData);
string base64Output = Convert.ToBase64String(outputData);
return base64Start + base64Output;
}
此外,根据the documentation中的说明,您应该使用MemoryStream.ToArray()
方法而不是MemoryStream.GetBuffer()
方法:
请注意,缓冲区包含分配的字节,这些字节可能未使用。例如,如果将字符串“ test”写入MemoryStream对象,则从GetBuffer返回的缓冲区的长度为256,而不是4,未使用252个字节。要仅获取缓冲区中的数据,请使用ToArray方法。但是,ToArray会在内存中创建数据的副本。
因此获取字节数组图像数据缩略图的原始代码应为
public static byte[] CreateImageThumbnail(byte[] image, int width, int height)
{
using (var stream = new System.IO.MemoryStream(image))
{
var img = Image.FromStream(stream);
var thumbnail = img.GetThumbnailImage(width, height, () => false, IntPtr.Zero);
using (var thumbStream = new System.IO.MemoryStream())
{
thumbnail.Save(thumbStream, System.Drawing.Imaging.ImageFormat.Jpeg);
return thumbStream.ToArray();
}
}
}
因为您需要能够使用"data:<mimetype>;base64,<base64encoding>"
格式的所有格式,并且base64编码的字符串不包含字符',',所以mime类型也不包含。因此,我们可以使用string.Split()
来获取base64编码的数据。
public static string CreateImageThumbnail(string src, int width, int height)
{
if(src == null) throw new ArgumentNullException(nameof(src));
string[] split = src.Split(',');
if(split.Length != 2) throw new ArgumentException("wrong format", nameof(src));
string base64Start = split[0] + ",";
string base64Input = split[1].Trim();
byte[] imageData = Convert.FromBase64String(base64Input);
byte[] outputData = CreateImageThumbnail(imageData);
string base64Output = Convert.ToBase64String(outputData);
return base64Start + base64Output;
}
答案 1 :(得分:0)
using System;
using System.Text.RegularExpressions;
// source element
var ImageLink = "<img src='http://nydomain.com/Image.jpg' />";
// pattern to extract image source
string ImageSrc = Regex.Match(ImageLink, "<img.+?src=[\"'](.+?)[\"'].+?>",
RegexOptions.IgnoreCase).Groups[1].Value;
// showing output here
Console.WriteLine(ImageSrc);