Unity: как сохранить несжатое изображение, загруженное пользователем? [Дубликат]

Это делается путем делегирования событий. Событие будет привязываться к элементу-оболочке, но будет делегировано элементу селекторного класса. Вот как это работает.

$('.wrapper-class').on("click", '.selector-class', function() {
    // Your code here
});

Примечание:

Элемент-оболочка-оболочка может быть любым ex. документа, тела или вашей обертки. Упаковщик должен уже существовать.

2
задан Diego 15 April 2017 в 01:28
поделиться

1 ответ

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

Вероятно, это причина 90 % вашей проблемы. WWW.text используется для не двоичных данных, таких как простой текст.

1. Загружать изображения или файлы с помощью WWW.bytes не WWW.text.

2. Сохранять изображение с помощью File.WriteAllBytes.

3. Прочитайте изображение с File.ReadAllBytes.

4. Загрузите изображение в текстуру с помощью Texture2D.LoadImage(yourImageByteArray);

5. Ваш путь должен быть Application.persistentDataPath/yourfolderName/thenFileName, если вы хотите, чтобы это было совместимо с каждой платформой. Он не должен быть Application.persistentDataPath/yourFileName или Application.dataPath.

6. Наконец, используйте Debug.Log, чтобы узнать, что происходит в вашем коде. Вы должны или, по крайней мере, использовать отладчик. Вы должны точно знать, где находится ваш код.

Вам все равно нужно выполнить некоторые проверки ошибок.

public void downloadImage(string url, string pathToSaveImage)
{
    WWW www = new WWW(url);
    StartCoroutine(_downloadImage(www, pathToSaveImage));
}

private IEnumerator _downloadImage(WWW www, string savePath)
{
    yield return www;

    //Check if we failed to send
    if (string.IsNullOrEmpty(www.error))
    {
        UnityEngine.Debug.Log("Success");

        //Save Image
        saveImage(savePath, www.bytes);
    }
    else
    {
        UnityEngine.Debug.Log("Error: " + www.error);
    }
}

void saveImage(string path, byte[] imageBytes)
{
    //Create Directory if it does not exist
    if (!Directory.Exists(Path.GetDirectoryName(path)))
    {
        Directory.CreateDirectory(Path.GetDirectoryName(path));
    }

    try
    {
        File.WriteAllBytes(path, imageBytes);
        Debug.Log("Saved Data to: " + path.Replace("/", "\\"));
    }
    catch (Exception e)
    {
        Debug.LogWarning("Failed To Save Data to: " + path.Replace("/", "\\"));
        Debug.LogWarning("Error: " + e.Message);
    }
}

byte[] loadImage(string path)
{
    byte[] dataByte = null;

    //Exit if Directory or File does not exist
    if (!Directory.Exists(Path.GetDirectoryName(path)))
    {
        Debug.LogWarning("Directory does not exist");
        return null;
    }

    if (!File.Exists(path))
    {
        Debug.Log("File does not exist");
        return null;
    }

    try
    {
        dataByte = File.ReadAllBytes(path);
        Debug.Log("Loaded Data from: " + path.Replace("/", "\\"));
    }
    catch (Exception e)
    {
        Debug.LogWarning("Failed To Load Data from: " + path.Replace("/", "\\"));
        Debug.LogWarning("Error: " + e.Message);
    }

    return dataByte;
}

Использование:

Подготовьте url для загрузки изображения и сохранения в:

//File url
string url = "http://www.wallpapereast.com/static/images/Cool-Wallpaper-11C4.jpg";
//Save Path
string savePath = Path.Combine(Application.persistentDataPath, "data");
savePath = Path.Combine(savePath, "Images");
savePath = Path.Combine(savePath, "logo");

Как вы можете видеть, нет необходимости добавлять расширение изображения ( png , jpg ) в savePath , и вы не должны добавлять расширение изображения в путь сохранения. Это облегчит загрузку позже, если вы не знаете расширение. Он должен работать до тех пор, пока изображение представляет собой формат изображения png или jpg .

Загружаемый файл:

downloadImage(url, savePath);

Загрузить изображение из файла:

byte[] imageBytes = loadImage(savePath);

Поместить изображение в Texture2D:

Texture2D texture;
texture = new Texture2D(2, 2);
texture.LoadImage(imageBytes);
3
ответ дан Programmer 19 August 2018 в 12:23
поделиться
  • 1
    Спасибо Программисту, это был определенно один из тех случаев, когда я крутился по кругу, и в конце концов я не думал об этом. Спасибо за функцию. – Diego 15 April 2017 в 09:35
  • 2
    Добро пожаловать. Вы должны быть в порядке, пока вы понимаете, что я объяснил в своем ответе. – Programmer 15 April 2017 в 09:40
  • 3
    Debug.Log является правильным. Вероятно, файл хранится в \ Users \ Diego \ Library \ Application Support \ DefaultCompany \ 3D Interactive App \ data \ Images и имя файла logo . Я не использую Mac, но вы можете Google просматривать скрытые папки в папке Library. Посмотрите здесь – Programmer 15 April 2017 в 11:09
  • 4
    Также проверьте правильность ответа. Вы можете проверить, существует ли файл с Directory.Exists(Path.GetDirectoryName(path)). Если вы ищете способ сохранить кучу данных, кроме изображений, видео и звука, используйте Json. Я сделал простой вспомогательный класс для этого здесь – Programmer 15 April 2017 в 11:13
  • 5
    Другая функция пригодится для более позднего этапа, спасибо. Наконец, если у вас есть время, чтобы помочь, при первой загрузке мне нужно каким-то образом изменить функцию loadImage, чтобы быть сопрограммой, поэтому часть, где я назначаю текстуру2d, дает ей возможность изменить файл, иначе я получаю исключение , В настоящее время я дублировал функцию loadimage, переименовав ее, поэтому, если локальный файл не найден, он вызывает мою сопрограмму, а не функцию loadimage. У меня возникли проблемы с поиском способа подождать, пока байты изображения не будут завершены в сопрограмме перед назначением. Каков наилучший способ? – Diego 15 April 2017 в 13:34
Другие вопросы по тегам:

Похожие вопросы: