Unity C# 从字节加载图像
Unity C# loadimage from byte
游戏有一个文件生成器(生成关卡文件)。
我更新了一个资产,添加了将 jpg 保存到文件的功能。
在那场比赛之后,读取文件并从中制作图像。
我的步骤:
- settings.imageCode = coloredTexture.EncodeToJPG();
- 保存到文件:
if (settings.rastr)
{
bytes.AddRange(System.BitConverter.GetBytes(settings.imageCode.Length));
bytes.AddRange(settings.imageCode);
}
- 开始游戏。游戏读取关卡文件(关于 img 的部分):
private byte[] GetSprite() private byte[] GetSprite()
{
int length = GetNextInt();
ArraySegment<byte> byteImage = new ArraySegment<byte>(levelFileBytes, byteIndex, length);
byteIndex += length;
int count = byteImage.Count;
return byteImage.Array;
}
- 尝试创建精灵并将其添加到 GO:
private void CreateRastrImage(LevelFileData levelFileData)
{
GameObject imageObj = new GameObject("Rastr");
RectTransform containerRectT = imageObj.AddComponent<RectTransform>();
containerRectT.SetParent(transform, false);
// Expand to fill
containerRectT.anchoredPosition = Vector2.zero;
containerRectT.anchorMin = Vector2.zero;
containerRectT.anchorMax = Vector2.one;
containerRectT.offsetMax = Vector2.zero;
containerRectT.offsetMin = Vector2.zero;
Image sprite = imageObj.AddComponent<Image>();
Texture2D spriteColor = new Texture2D(levelFileData.imageWidth, levelFileData.imageHeight);
//ImageConversion.LoadImage(spriteColor, levelFileData.rastrBytes);
spriteColor.LoadImage(levelFileData.rastrBytes);
Sprite fileSptire = Sprite.Create(spriteColor, new Rect(0f, 0f, spriteColor.width, spriteColor.height), new Vector2(0f, 0f));
sprite.sprite = fileSptire;
}
- 结果:red question mark
关于结果,source img 是这个 jpg 文件:picture
使用 jpg (RGB24),也尝试另一种 TextureFormat。我认为阅读有问题(img 没有读完整),但我在 VS 中检查了停止 poing 的长度。
问题出在 ArraySegment 中。
当我尝试 return byteImage.Array - 它的 return 完整数组 (levelFileBytes)。
我现在的解决方案:
private byte[] GetSprite()
{
int length = GetNextInt();
byte[] imageBytes = new byte[length];
for(int i = 0; i < length; i++)
{
imageBytes[i] = levelFileBytes[byteIndex + i];
}
byteIndex += length;
return imageBytes;
}
游戏有一个文件生成器(生成关卡文件)。 我更新了一个资产,添加了将 jpg 保存到文件的功能。 在那场比赛之后,读取文件并从中制作图像。
我的步骤:
- settings.imageCode = coloredTexture.EncodeToJPG();
- 保存到文件:
if (settings.rastr)
{
bytes.AddRange(System.BitConverter.GetBytes(settings.imageCode.Length));
bytes.AddRange(settings.imageCode);
}
- 开始游戏。游戏读取关卡文件(关于 img 的部分):
private byte[] GetSprite() private byte[] GetSprite()
{
int length = GetNextInt();
ArraySegment<byte> byteImage = new ArraySegment<byte>(levelFileBytes, byteIndex, length);
byteIndex += length;
int count = byteImage.Count;
return byteImage.Array;
}
- 尝试创建精灵并将其添加到 GO:
private void CreateRastrImage(LevelFileData levelFileData)
{
GameObject imageObj = new GameObject("Rastr");
RectTransform containerRectT = imageObj.AddComponent<RectTransform>();
containerRectT.SetParent(transform, false);
// Expand to fill
containerRectT.anchoredPosition = Vector2.zero;
containerRectT.anchorMin = Vector2.zero;
containerRectT.anchorMax = Vector2.one;
containerRectT.offsetMax = Vector2.zero;
containerRectT.offsetMin = Vector2.zero;
Image sprite = imageObj.AddComponent<Image>();
Texture2D spriteColor = new Texture2D(levelFileData.imageWidth, levelFileData.imageHeight);
//ImageConversion.LoadImage(spriteColor, levelFileData.rastrBytes);
spriteColor.LoadImage(levelFileData.rastrBytes);
Sprite fileSptire = Sprite.Create(spriteColor, new Rect(0f, 0f, spriteColor.width, spriteColor.height), new Vector2(0f, 0f));
sprite.sprite = fileSptire;
}
- 结果:red question mark
关于结果,source img 是这个 jpg 文件:picture 使用 jpg (RGB24),也尝试另一种 TextureFormat。我认为阅读有问题(img 没有读完整),但我在 VS 中检查了停止 poing 的长度。
问题出在 ArraySegment 中。 当我尝试 return byteImage.Array - 它的 return 完整数组 (levelFileBytes)。 我现在的解决方案:
private byte[] GetSprite()
{
int length = GetNextInt();
byte[] imageBytes = new byte[length];
for(int i = 0; i < length; i++)
{
imageBytes[i] = levelFileBytes[byteIndex + i];
}
byteIndex += length;
return imageBytes;
}