'Convert Image to base64 and vice versa in Unity

i wanted to convert this image to Base64 in unity C# But I am kind of lost, can someone help? This is my code

using UnityEngine;
using System.Collections;
using System.IO;
using UnityEngine.UI;
using System.Collections.Generic;
using UnityEngine.Networking;


public class GetCam : MonoBehaviour
{
    WebCamTexture webCam;
    string your_path = "C:\\Users\\Jay\\Desktop";
    public RawImage display;
    public AspectRatioFitter fit;

    public void Start()
    {
        webCam = new WebCamTexture();
        webCam.Play();

        if(WebCamTexture.devices.Length==0)
        {
            Debug.LogError("can not found any camera!");
            return;
        }
        int index = -1;
        for (int i = 0; i < WebCamTexture.devices.Length; i++)
        {
            if (WebCamTexture.devices[i].name.ToLower().Contains("your webcam name"))
            {
                Debug.LogError("WebCam Name:" + WebCamTexture.devices[i].name + "   Webcam Index:" + i);
                index = i;
            }
        }
    }

   
    public void Update()
    {
        float ratio = (float)webCam.width / (float)webCam.height;
        fit.aspectRatio = ratio;


        float ScaleY = webCam.videoVerticallyMirrored ? -1f : 1f;
        display.rectTransform.localScale = new Vector3(1f, ScaleY, 1f);

        int orient = -webCam.videoRotationAngle;
        display.rectTransform.localEulerAngles = new Vector3(0, 0, orient);
    }


    public void callTakePhoto()
    {
        StartCoroutine(TakePhoto());
    }

    IEnumerator TakePhoto()  
    {
        yield return new WaitForEndOfFrame();

        Texture2D photo = new Texture2D(webCam.width, webCam.height);
        photo.SetPixels(webCam.GetPixels());
        photo.Apply();

        //Encode to a PNG
        byte[] bytes = photo.EncodeToPNG();
       
        //Convert PNG to Base64


        //Write out the PNG. Of course you have to substitute your_path for something sensible
        File.WriteAllBytes(your_path + "\\photo.png", bytes);
        //lol
    }

    public void callpostRequest()
    {
        StartCoroutine(postRequest("http://127.0.0.1:5000/"));
    }

    IEnumerator postRequest(string url)
    {
        WWWForm form = new WWWForm();
        form.AddField("name","hi from unity client");
        // form.AddField("nice","ok");

        UnityWebRequest uwr = UnityWebRequest.Post(url, form);
        yield return uwr.SendWebRequest();
        StartCoroutine(getRequest("http://127.0.0.1:5000/"));

        if (uwr.isNetworkError)
        {
            Debug.Log("Error While Sending: " + uwr.error);
        }
        else
        {
            Debug.Log("Received: " + uwr.downloadHandler.text);
        }
    }

    IEnumerator getRequest(string uri)
    {
        UnityWebRequest uwr = UnityWebRequest.Get(uri);

        yield return uwr.SendWebRequest();

        if (uwr.isNetworkError)
        {
            Debug.Log("Error While Sending: " + uwr.error);
        }
        else
        {
            Debug.Log("Received: " + uwr.downloadHandler.text);
        }
    }
}

For now all it does is click picture and save it to desktop and then below is the code of UnityWebRequest class which sends a hi message to a flask server and receives back the same

What i want to do is convert image to base64 and send to flask server, can anyone help? thank you



Solution 1:[1]

In general you would simply do Convert.ToBase64String(byte[])

string base64String = Convert.ToBase64String(byteArray);

and accordingly Convert.FromBase64String(string)

byte[] byteArray = Convert.FromBase64String(base64String);

Why though?

Images are "big" binary data. Base64 blows each byte up into hexadecimal chars which adds a lot of overhead.

=> Why not rather send the binary data directly?

See MultiPartFormFileSection and use the overload public static Networking.UnityWebRequest Post(string uri, List<IMultipartFormSection> multipartFormSections);

like e.g.

IEnumerator Upload(byte[] fileContent)
{
    var sections = new List<IMultiPartFormSection>();

    // According to your servers needs
    sections.Add(new MultiPartFormFileSection("files", fileContent, "photo.png", "image/png"));

    using(UnityWebRequest www = UnityWebRequest.Post("http://127.0.0.1:5000/", sections))
    {
        yield return www.SendWebRequest();

        if (www.result != UnityWebRequest.Result.Success)
        {
            Debug.Log(www.error);
        }
        else
        {
            Debug.Log("Form upload complete!");

            // Get the server response
            // NO NEED FOR A GET REQUESTS!
            var serverResponse = www.downloadHandler.text;

            Debug.Log(serverResponse);
        }
    }
}

and for the downloading accordingly use UnityWebRequestTexture.GetTexture like

using (var uwr = UnityWebRequestTexture.GetTexture("https://www.my-server.com/myimage.png"))
{
    yield return uwr.SendWebRequest();

    if (uwr.result != UnityWebRequest.Result.Success)
    {
        Debug.Log(uwr.error);
    }
    else
    {
        // Get downloaded texture
        var texture = DownloadHandlerTexture.GetContent(uwr);
        ...
    }
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1