anthonypliu
anthonypliu

Reputation: 12437

converting a base 64 string to an image and saving it

Here is my code:

protected void SaveMyImage_Click(object sender, EventArgs e)
        {
            string imageUrl = Hidden1.Value;
            string saveLocation = Server.MapPath("~/PictureUploads/whatever2.png") ; 


            HttpWebRequest imageRequest = (HttpWebRequest)WebRequest.Create(imageUrl);
            WebResponse imageResponse = imageRequest.GetResponse();

            Stream responseStream = imageResponse.GetResponseStream();

            using (BinaryReader br = new BinaryReader(responseStream))
            {
                imageBytes = br.ReadBytes(500000);
                br.Close();
            }
            responseStream.Close();
            imageResponse.Close();

            FileStream fs = new FileStream(saveLocation, FileMode.Create);
            BinaryWriter bw = new BinaryWriter(fs);
            try
            {
                bw.Write(imageBytes);
            }
            finally
            {
                fs.Close();
                bw.Close();
            }
        }
}

The top imageUrl declartion is taking in a Base64 image string, and I want to convert it into an image. I think my set of code only works for images like "www.mysite.com/test.jpg" not for a Base64 string. Anybody have some suggestions? Thanks!

Upvotes: 177

Views: 405457

Answers (12)

Aman Jain
Aman Jain

Reputation: 11

you can convert a base64 string to an image and save it using the following code. This example assumes you're working with a console application, but the core logic can be adapted for other types of projects.

using System;
using System.Drawing;
using System.IO;

class Program
{
     static void Main()
       {
    // Replace this string with your actual base64-encoded image
    string base64String = "your_base64_encoded_string_here";

    // Convert base64 to bytes
    byte[] imageBytes = Convert.FromBase64String(base64String);

    // Convert bytes to image
    Image image = ConvertBytesToImage(imageBytes);

    // Specify the path to save the image
    string filePath = "path_to_save_image.png";

    // Save the image to the specified path
    SaveImage(image, filePath);

    Console.WriteLine($"Image saved at: {filePath}");
}

static Image ConvertBytesToImage(byte[] imageBytes)
{
    using (MemoryStream ms = new MemoryStream(imageBytes))
    {
        Image image = Image.FromStream(ms);
        return image;
    }
}

static void SaveImage(Image image, string filePath)
{
    image.Save(filePath, System.Drawing.Imaging.ImageFormat.Png);
}

}

Upvotes: 0

Ester Kaufman
Ester Kaufman

Reputation: 868

In NetCore 6.0, you can use HttpClient and the async methods in the new File class.

The implementation is very simple:

static async Task DownloadFile(string imageUrl, string pathToSave)
{
    var content = await GetUrlContent(url);
    if (content != null)
    {       
        await File.WriteAllBytesAsync(pathToSave, content);
    }
}

static async Task<byte[]?> GetUrlContent(string url)
{
    using (var client = new HttpClient())
    using (var result = await client.GetAsync(url))
        return result.IsSuccessStatusCode ? await result.Content.ReadAsByteArrayAsync():null;
}

Usage:

await DownloadFile("https://example.com/image.jpg", @"c:\temp\image.jpg");

Upvotes: 0

Mehdi Dehghani
Mehdi Dehghani

Reputation: 11601

Using MemoryStream is not a good idea and violates a specification in MSDN for Image.FromStream(), where it says

You must keep the stream open for the lifetime of the Image.

A better solution is using ImageConverter, e.g:

public Image ConvertBase64ToImage(string base64)
    => (Bitmap)new ImageConverter().ConvertFrom(Convert.FromBase64String(base64));

Upvotes: 3

KHALID
KHALID

Reputation: 21

public bool SaveBase64(string Dir, string FileName, string FileType, string Base64ImageString)
{
    try
    {
        string folder = System.Web.HttpContext.Current.Server.MapPath("~/") + Dir;
        if (!Directory.Exists(folder))
        {
            Directory.CreateDirectory(folder);
        }

        string filePath = folder + "/" + FileName + "." + FileType;
        File.WriteAllBytes(filePath, Convert.FromBase64String(Base64ImageString));
        return true;
    }
    catch
    {
        return false;
    }

}

Upvotes: 2

CRice
CRice

Reputation: 12567

Here is an example, you can modify the method to accept a string parameter. Then just save the image object with image.Save(...).

public Image LoadImage()
{
    //data:image/gif;base64,
    //this image is a single pixel (black)
    byte[] bytes = Convert.FromBase64String("R0lGODlhAQABAIAAAAAAAAAAACH5BAAAAAAALAAAAAABAAEAAAICTAEAOw==");

    Image image;
    using (MemoryStream ms = new MemoryStream(bytes))
    {
        image = Image.FromStream(ms);
    }

    return image;
}

It is possible to get an exception A generic error occurred in GDI+. when the bytes represent a bitmap. If this is happening save the image before disposing the memory stream (while still inside the using statement).

Upvotes: 286

afranz409
afranz409

Reputation: 772

If you have a string of binary data which is Base64 encoded, you should be able to do the following:

byte[] encodedDataAsBytes = System.Convert.FromBase64String(encodedData);

You should be able to write the resulting array to a file.

Upvotes: 6

Yogesh Bhokare
Yogesh Bhokare

Reputation: 91

Here is working code for converting an image from a base64 string to an Image object and storing it in a folder with unique file name:

public void SaveImage()
{
    string strm = "R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"; 

    //this is a simple white background image
    var myfilename= string.Format(@"{0}", Guid.NewGuid());

    //Generate unique filename
    string filepath= "~/UserImages/" + myfilename+ ".jpeg";
    var bytess = Convert.FromBase64String(strm);
    using (var imageFile = new FileStream(filepath, FileMode.Create))
    {
        imageFile.Write(bytess, 0, bytess.Length);
        imageFile.Flush();
    }
}

Upvotes: 9

Milan Sheth
Milan Sheth

Reputation: 962

In my case it works only with two line of code. Test the below C# code:

String dirPath = "C:\myfolder\";
String imgName = "my_mage_name.bmp";

byte[] imgByteArray = Convert.FromBase64String("your_base64_string");
File.WriteAllBytes(dirPath + imgName, imgByteArray);

That's it. Kindly up vote if you really find this solution works for you. Thanks in advance.

Upvotes: 10

abhishek
abhishek

Reputation: 79

In a similar scenario what worked for me was the following:

byte[] bytes = Convert.FromBase64String(Base64String);    
ImageTagId.ImageUrl = "data:image/jpeg;base64," + Convert.ToBase64String(bytes);

ImageTagId is the ID of the ASP image tag.

Upvotes: 7

INT_24h
INT_24h

Reputation: 1561

You can save Base64 directly into file:

string filePath = "MyImage.jpg";
File.WriteAllBytes(filePath, Convert.FromBase64String(base64imageString));

Upvotes: 126

Austin
Austin

Reputation: 369

Here is what I ended up going with.

    private void SaveByteArrayAsImage(string fullOutputPath, string base64String)
    {
        byte[] bytes = Convert.FromBase64String(base64String);

        Image image;
        using (MemoryStream ms = new MemoryStream(bytes))
        {
            image = Image.FromStream(ms);
        }

        image.Save(fullOutputPath, System.Drawing.Imaging.ImageFormat.Png);
    }

Upvotes: 36

Nishant Kumar
Nishant Kumar

Reputation: 6083

I would suggest via Bitmap:

public void SaveImage(string base64)
{
    using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(base64)))
    {
        using (Bitmap bm2 = new Bitmap(ms))
        {
            bm2.Save("SavingPath" + "ImageName.jpg");
        }
    }
}

Upvotes: 14

Related Questions