【问题标题】:Generating Thumbnail C# from base64string从 base64string 生成缩略图 C#
【发布时间】:2016-05-03 11:34:27
【问题描述】:

我正在尝试从base64string 生成缩略图。我将图像存储在表格中,并尝试从正在存储的base64string 生成缩略图。

如果我提供图像的路径,我可以生成缩略图,但这不适用于我的情况。

这是从图像路径生成缩略图的工作解决方案:

protected void GenerateThumbnail(object sender, EventArgs e)
{
        string path = Server.MapPath("../src/img/myImage.png");
        System.Drawing.Image image = System.Drawing.Image.FromFile(path);
        using (System.Drawing.Image thumbnail = image.GetThumbnailImage(100, 100, new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback), IntPtr.Zero))
        {
            using (MemoryStream memoryStream = new MemoryStream())
            {
                thumbnail.Save(memoryStream, ImageFormat.Png);
                Byte[] bytes = new Byte[memoryStream.Length];
                memoryStream.Position = 0;
                memoryStream.Read(bytes, 0, (int)bytes.Length);
                string base64String = Convert.ToBase64String(bytes, 0, bytes.Length);
                Image2.ImageUrl = "data:image/png;base64," + base64String;
                Image2.Visible = true;
            }
        }
}

谁能提供任何关于如何使用base64string而不是生成缩略图的图像路径的建议?

【问题讨论】:

  • 如果您想对位图进行缩略图,请在将其转换为 base64 之前进行。以 base64 字符串开头意味着撤消最后几个步骤
  • 你能举个例子吗?
  • 对不起,这个帖子让我很困惑。您一个 base64 字符串并想将其转换回位图并缩略图?
  • 是的,我可以将 FromFile(path) 转换为缩略图,但无法确定如何将 base64 转换为缩略图
  • byte[] bytes = Convert.FromBase64String(b64); 会将 b64 字符串转换为可以在 memstream ctor 中使用的 byte[]

标签: c# base64 drawing thumbnails


【解决方案1】:

假设b64 是base64 字符串,您可以将其转换为字节数组并使用它来构造起始图像。

byte[] bytes = Convert.FromBase64String(b64);
using (MemoryStream ms = new MemoryStream(bytes))
{
    Bitmap thumb = new Bitmap(100, 100);
    using (Image bmp = Image.FromStream(ms))
    {
        using (Graphics g = Graphics.FromImage(thumb))
        { 
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            g.CompositingQuality = CompositingQuality.HighQuality;
            g.SmoothingMode = SmoothingMode.HighQuality;
            g.DrawImage(bmp, 0, 0, 100, 100);
        }
    }
    // a picturebox to show/test the result
    picOut.Image = thumb;
}

用完后一定要把拇指扔掉。

【讨论】:

  • 忘记声明picOut
  • 嗯...我在声明bmp 变量的那一行得到Parameter is not valid。有什么想法吗?
  • 看起来它实际上并没有保存在base64中。这就是问题
  • 这是您的数据 - 如果 B64 不代表图像数据,它将在该行失败。如果它不是真正的 Base64,它应该在 Convert.From 行上失败
【解决方案2】:

混合了网上找到的一些技巧。 (来自@Plutonix)

string ThumbNailBase64 = ResizeBase64Image(YourBase64String,200, 300);

base64 输入 => 调整大小 => base64 输出

您将获得所需的具有自动纵横比的缩略图。

public static string ResizeBase64Image(string Base64String, int desiredWidth, int desiredHeight)
{
    Base64String = Base64String.Replace("data:image/png;base64,", "");

    // Convert Base64 String to byte[]
    byte[] imageBytes = Convert.FromBase64String(Base64String);

    using (MemoryStream ms = new MemoryStream(imageBytes))
    {                
        // Convert byte[] to Image
        ms.Write(imageBytes, 0, imageBytes.Length);
        Image image = Image.FromStream(ms, true);

        var imag = ScaleImage(image, desiredWidth, desiredHeight);

        using (MemoryStream ms1 = new MemoryStream())
        {
            //First Convert Image to byte[]
            imag.Save(ms1, imag.RawFormat);
            byte[] imageBytes1 = ms1.ToArray();

            //Then Convert byte[] to Base64 String
            string base64String = Convert.ToBase64String(imageBytes1);
            return "data:image/png;base64,"+base64String;
        }
    }
}

public static Image ScaleImage(Image image, int maxWidth, int maxHeight)
{
    var ratioX = (double)maxWidth / image.Width;
    var ratioY = (double)maxHeight / image.Height;
    var ratio = Math.Min(ratioX, ratioY);

    var newWidth = (int)(image.Width * ratio);
    var newHeight = (int)(image.Height * ratio);

    var newImage = new Bitmap(newWidth, newHeight);

    using (var graphics = Graphics.FromImage(newImage))
        graphics.DrawImage(image, 0, 0, newWidth, newHeight);

    return newImage;
}

【讨论】:

  • 尝试访问 scaledImage.RawFormat 时出现空异常。尝试使用 JPEG 格式,但无法正确加载图像。
猜你喜欢
  • 2016-04-09
  • 2011-07-19
  • 1970-01-01
  • 2014-01-12
  • 2013-10-22
  • 1970-01-01
  • 2010-11-26
  • 2013-11-23
  • 1970-01-01
相关资源
最近更新 更多