我正在尝试在Android设备上下载并保存文件。在PC上工作正常,但我的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));
我认为编码类型存在问题,但是我尝试了所有编码类型,但仍然无法正常工作,并加载了一些错误纹理。
答案 0 :(得分:0)
您应该实际将其保存为GetRawTextureData()
或LoadRawTextureData
格式,而不是使用.png
和.jpg
!与纯.jpg
或.png
文件数据相比,“ RawTextureData”非常庞大。
请改为使用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));
// ...
(也许还会签出this answer来获取其他写入文件的方法。)
和
// ...
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
(请参阅here),因此也许您还应该使用Encoding.UTF8
之类的固定编码。
尽管要加载文件,但实际上我更喜欢使用UnityWebRequest
,它也可以用于本地文件存储中的文件!