Hi Nice people!
Today I’ll talk about load a JPG image from an external source and use it in your games or apps, so let’s start!
First we have to stop watching image with eyes… I mean… now we’ll watch our full of color world as Neo of Matrix, we’ll see a sequence of bytes dropping everywhere
If you convert an image to byte array you will get something like that:
0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A,0x00,0x00,0x00,0x0D,0x49,0x48,0x44,0x52,
0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x08,0x00,0x00,0x00,0x00,0x8F,0x02,0x2E,
0x02,0x00,0x00,0x01,0x57,0x49,0x44,0x41,0x54,0x78,0x01,0xA5,0x57,0xD1,0xAD,0xC4,
0x30,0x08,0x83,0x81,0x32,0x4A,0x66,0xC9,0x36,0x99,0x85,0x45,0xBC,0x4E,0x74,0xBD,
0x8F,0x9E,0x5B,0xD4,0xE8,0xF1,0x6A,0x7F,0xDD,0x29,0xB2,0x55,0x0C,0x24,0x60,0xEB,
0x0D,0x30,0xE7,0xF9,0xF3,0x85,0x40,0x74,0x3F,0xF0,0x52,0x00,0xC3,0x0F,0xBC,0x14,
… etc …
This is the way used by Unity to see the images O.O
Let’s go on with practice, theory is boring :p
Load local JPG and apply to GameObject-Material-MainTexture
1. Create a Scene with a Cube and attach the script below:
2. c# script
using UnityEngine; using System.Collections; using System.IO; // namespace to use File.ReadAllBytes public class LoadLocalTexture : MonoBehaviour { string filePath; // it is as "D:/Unity/Photo-Voodoo/FotoTest/img1.jpg" public byte[] fileData; // load data inside a byte array 0x89,0x50,0x4E,0x47,0x0D... public void Start() { filePath = "D:/MyFolder/img1.jpg"; // the path of the image fileData = File.ReadAllBytes(filePath); // 1.read the bytes array Texture2D tex = new Texture2D(2, 2); // 2.create a texture named tex tex.LoadImage(fileData); // 3.load inside tx the bytes and use the correct image size GetComponent<Renderer>().material.mainTexture = tex; // 4.apply tex to material.mainTexture }// END Start void Update () { }// END Update() }// END Mono
Load local JPG and apply to UI Image
1. Create a Scene with a UI Image and attach the script below:
2. c# script
using UnityEngine; using System.Collections; using UnityEngine.UI; // namespace to use UI using System.IO; // namespace to use File.ReadAllBytes public class LoadLocalTextureToImageUI : MonoBehaviour { string filePath; // it is as "D:/Unity/Photo-Voodoo/FotoTest/img1.jpg" public byte[] fileData; // load data inside a byte array 0x89,0x50,0x4E,0x47,0x0D... public Image imageToDisplay; // Assign in Inspector the UI Image // Use this for initialization void Start () { filePath = "D:/MyFolder/img1.jpg"; // the path of the image fileData = File.ReadAllBytes(filePath); // 1.read the bytes array Texture2D tex = new Texture2D(2, 2); // 2.create a texture named tex tex.LoadImage(fileData); // 3.load inside tx the bytes and use the correct image size Rect rec = new Rect(0, 0, tex.width, tex.height); // 4.create a rect using the textute dimensions Sprite spriteToUse = Sprite.Create(tex,rec,new Vector2(0.5f,0.5f),100); //5. convert the texture in sprite imageToDisplay.sprite = spriteToUse; //6.load the sprite used by UI Image }// END Start() // Update is called once per frame void Update () { }// END Update() }// END Mono
3. Assign in Inspector the UI Image to imageToDisplay variable
Load www JPG and apply to UI Image
1. Create a Scene with a Cube and attach the script below:
2. c# script
using UnityEngine; using System.Collections; using UnityEngine.UI; // namespace to use UI public class LoadwwwTextureToImageUI : MonoBehaviour { public Image imageToDisplay; // Assign in Inspector the UI Image public string addressWeb = "http://www.lucedigitale.com/img1.jpg"; // Use this for initialization void Start () { StartCoroutine(isDownloading(addressWeb)); }// END Start() IEnumerator isDownloading(string url){ yield return new WaitForSeconds(1); // wait for one sec, without it you will have a compiiler error var www = new WWW(url); // 1.start a download of the given URL yield return www; // 2.wait until the download is done // 3.create a texture in DXT1 format Texture2D texture = new Texture2D(www.texture.width, www.texture.height, TextureFormat.DXT1, false); www.LoadImageIntoTexture(texture); //4.load data into a texture Rect rec = new Rect(0, 0, texture.width, texture.height); //5.create a rect using texture dimensions Sprite spriteToUse = Sprite.Create(texture,rec,new Vector2(0.5f,0.5f),100); // 6.convert the texture to sprite imageToDisplay.sprite = spriteToUse; //7.change the sprite of UI Image www.Dispose(); //8.drop the web connection NOTE: Unity drop automatically the connection at the end of the download, but we put it as a precaution www = null; }// END IEnumerator void Update () { }// END Update() }// END Mono
3. Assign in Inspector the UI Image to imageToDisplay variable
I hope this article has been helpful, greetings
Reference: https://docs.unity3d.com/ScriptReference/Texture2D.LoadImage.html
Reference: http://answers.unity3d.com/questions/1122905/how-do-you-download-image-to-uiimage.html