Unity Serialize и кодирование спрайта - PullRequest
0 голосов
/ 06 марта 2019

Я пытаюсь загрузить и сохранить файл на устройстве Android.Он отлично работает на ПК, но у меня есть визуальная ошибка на моем телефоне Android.Посмотрите на экран, пожалуйста

Мой код: это то, как я загружаю и сериализую его

Icon = Sprite.Create(texture2dd, new Rect(0.0f, 0.0f, texture2dd.width, texture2dd.height), new Vector2(0.5f, 0.5f), 100.0f);

byte[] texturebytes = Icon.texture.GetRawTextureData();
File.WriteAllText(Application.persistentDataPath + "/icon", Encoding.Default.GetString(texturebytes));
File.WriteAllText(Application.persistentDataPath + "/iconinfo", Icon.texture.width + "@@@" + Icon.texture.height);

И это, как я пытаюсьчтобы загрузить его позже:

string[] info = File.ReadAllText(path + "info").Split(new string[] { "@@@" }, StringSplitOptions.None);
int width, height;
int.TryParse(info[0], out width);
int.TryParse(info[1], out height);
byte[] bytesIcon = Encoding.Default.GetBytes(File.ReadAllText(path));
Texture2D iconText = new Texture2D(width, height, TextureFormat.ARGB32, false);
iconText.LoadRawTextureData(bytesIcon);
iconText.Apply();
return Sprite.Create(iconText, new Rect(0, 0, width, height), new Vector2(0.5f, 0.5f));

Я думаю, что проблема в типе кодирования, но я перепробовал все типы кодирования, и он все еще не работает, и загрузил некоторую текстуру ошибки.

1 Ответ

0 голосов
/ 06 марта 2019

Вместо использования GetRawTextureData() и LoadRawTextureData вы должны сохранить его в формате .png или .jpg! «RawTextureData» очень велика по сравнению с чистыми данными .jpg или .png.


Вместо этого используйте EncodeToPNG (или EncodeToJPG, если качество не так важно - чем не забывать также принимать окончание файла) и LoadImage.

Кроме того, LoadImage фактически «знает» размер изображения (потому что оно закодировано в файл png или jpg), поэтому вам вообще не нужен ваш файл iconinfo!

что-то вроде

// ...
Icon = Sprite.Create(texture2dd, new Rect(0.0f, 0.0f, texture2dd.width, texture2dd.height), Vector2.one * 0.5f, 100.0f);

byte[] texturebytes = Icon.texture.EncodeToPNG();
File.WriteAllText(Application.persistentDataPath + "/icon.png", Encoding.Default.GetString(texturebytes));
// ...

(возможно, также проверьте этот ответ для других способов записи файла.)

и

// ...
byte[] bytesIcon = Encoding.Default.GetBytes(File.ReadAllText(path));
// as the example in the documentation states:
//   Texture size does not matter, since
//   LoadImage will replace it with incoming image size.
Texture2D iconText = new Texture2D(2, 2);
iconText.LoadImage(bytesIcon);
// Also from the documentation:
//   Texture will be uploaded to the GPU automatically; there's no need to call Apply.
return Sprite.Create(iconText, new Rect(0, 0, iconText.width, iconText.height), Vector2.one * 0.5f);

И да, еще одна проблема может заключаться в том, что вы использовали Encoding.Default (см. здесь ), поэтому, возможно, вам также следует использовать фиксированную кодировку, например Encoding.UTF8.


Хотя для загрузки файла я бы предпочел использовать UnityWebRequest, который также можно использовать для файла из локального хранилища файлов!

...