Как преобразовать изображения в текстуры? - PullRequest
0 голосов
/ 10 июля 2020

Я использую этот скрипт, но не знаю, как преобразовать информационный массив в текстуры и назначить информационные изображения массиву текстур.

using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Video;

public class StreamVideo : MonoBehaviour
{
    public Texture[] frames;                // array of textures
    public float framesPerSecond = 2.0f;    // delay between frames
    public RawImage image;

    void Start()
    {
        DirectoryInfo dir = new DirectoryInfo(@"C:\tmp");
        string[] extensions = new[] { ".jpg", ".JPG", ".jpeg", ".JPEG", ".png", ".PNG", ".ogg", ".OGG" };
        FileInfo[] info = dir.GetFiles().Where(f => extensions.Contains(f.Extension.ToLower())).ToArray();

        if (image == null)
        {
            //Get Raw Image Reference
            image = gameObject.GetComponent<RawImage>();
        }
    }

    void Update()
    {
        int index = (int)(Time.time * framesPerSecond) % frames.Length;
        image.texture = frames[index]; //Change The Image
    }
}

Затем я скопировал изображения из tmp папку в новую папку моего проекта, но если я выберу все изображения в активах, я не могу перетащить их в инспектор скрипта, я могу перетаскивать их только по одному, и это займет время, так как я могу сделать это с помощью скрипта ?

Ответы [ 3 ]

1 голос
/ 10 июля 2020

Ну, вам нужно будет прочитать соответствующий файл, например, используя File.ReadAllBytes

Тогда вы можете использовать ImageConversion.LoadImage

Я бы затем выполните весь процесс загрузки уже при запуске приложения, а позже только обменивайте текстуру, например,

public class StreamVideo : MonoBehaviour
{
    public Texture[] frames;                // array of textures
    public float framesPerSecond = 2.0f;    // delay between frames
    public RawImage image;

    void Start()
    {
        DirectoryInfo dir = new DirectoryInfo(@"C:\tmp");
        // since you use ToLower() the capitalized version are quite redundant btw ;)
        string[] extensions = new[] { ".jpg", ".jpeg", ".png", ".ogg" };
        FileInfo[] info = dir.GetFiles().Where(f => extensions.Contains(f.Extension.ToLower())).ToArray();

        if (!image)
        {
            //Get Raw Image Reference
            image = gameObject.GetComponent<RawImage>();
        }

        frames = GetTextures(infos);
    }

    private Texture[] GetTextures(FileInfo[] fileInfos)
    {
        var output = new Texture[fileInfos.Length];
        for(var i = 0; i < fileInfos.Length; i++)
        {
            var bytes = File.ReadAllBytes(fileInfos[i].fullName);
            output[i] = new Texture2D(1,1);
            if(!ImageConversion.LoadImage(output[i], bytes, false))
            {
                Debug.LogError($"Could not load image from {fileInfos.Length}!", this);
            }
        }
    }

    void Update()
    {
        int index = (int)(Time.time * framesPerSecond) % frames.Length;
        image.texture = frames[index]; //Change The Image
    }
}

Примечание: набрано на смартфоне, но я надеюсь, что идея прояснится

0 голосов
/ 10 июля 2020

Сам еще не делал этого, но я считаю, что это должно работать с: https://docs.unity3d.com/ScriptReference/ImageConversion.LoadImage.html В приведенном здесь примере кода, с гарантированным "imageAsset.bytes", примените эту функцию к вашим файлам (вызов FullPath в ваших экземплярах FileInfo): https://docs.unity3d.com/ScriptReference/Windows.File.ReadAllBytes.html

0 голосов
/ 10 июля 2020

Вы можете перетащить несколько выбранных изображений. Сначала вам нужно заблокировать обзор инспектора с помощью замка (невозможно, если вы его пропустите). Затем выберите все изображения и перетащите их на name_of_the_array (не в поле). Это просто вопрос настройки механизма перетаскивания c, и ничего больше.

Кроме того, ссылка на fileinfo в вашем вопросе немного сбивает с толку, поскольку вы все равно ничего не делаете с результатом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...