在C#中从img src获取图像缩略图

时间:2018-07-31 22:58:27

标签: c# arrays image

我正在将一个字符串传递给具有图像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字符串转换为该方法前后的字节数组?

2 个答案:

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