Search code examples
c#base64drawingthumbnails

Generating Thumbnail C# from base64string


I am trying to generate a thumbnail from the base64string. I am storing the image in a table and am trying to generate a thumbnail from the base64string being stored.

I am able to generate the thumbnail if I provide a path to the image, but that will not work in my case.

This is the working solution of generating a thumbnail from an image path:

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;
            }
        }
}

Can anyone provide any advice on how to use the base64string instead of the image path the generate thumbnail?


Solution

  • Assuming, b64 is the base64 string, you can convert it to a byte array and use that to construct the starting image.

    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;
    }
    

    Be sure to dispose of the thumb when you are done with it.