Unity C# 从字节加载图像

Posted

技术标签:

【中文标题】Unity C# 从字节加载图像【英文标题】:Unity C# loadimage from byte 【发布时间】:2022-01-06 12:55:47 【问题描述】:

游戏有一个文件生成器(制作关卡文件)。 我更新资产,将保存 jpg 的功能添加到文件。 之后游戏读取文件并从中制作图像。

我的步骤:

    settings.imageCode = colouredTexture.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

关于结果,来源 img 其这个 jpg 文件:picture 使用 jpg (RGB24),也可以尝试另一种 TextureFormat。我认为阅读有问题(img 未满),但我在 VS 中停止定位来检查长度。

【问题讨论】:

关于结果,来源 img 其这个 jpg 文件:picture 要保存纹理,请使用 EncodeToPNG 或 EncodeToJPG。 @yasirkula 这是我的第一步:) 【参考方案1】:

问题出在 ArraySegment 中。 当我尝试返回 byteImage.Array - 它返回完整数组(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;
        

【讨论】:

以上是关于Unity C# 从字节加载图像的主要内容,如果未能解决你的问题,请参考以下文章

在 Qml 中从字节数组加载到图像

Python OpenCV从字节字符串加载图像

在 Unity3d 中从 iphone 加载图像

在 Flutter/Dart 中从字节加载图像的问题

创建垫子后从字节向量将图像加载到垫子上

在 C# 中从项目的资源区域加载图像