从Texture2D创建UI图像

5

我正在开发一款直播应用,它能够接收JPEG图像的字节数组并使用UI.Image屏幕上显示。目前它已经很好地工作,但我想要进行优化并有一些问题需要解决。当前,下面的代码将字节数组转换为Texture2D,然后从Texture2D创建Sprite,最后将该Sprite分配给UI.Iamge以在屏幕上显示。

Texture2D camTexture;
Image screenDisplay;
public byte[] JPEG_VIDEO_STREAM;
bool updateScreen = false;

//初始化

JPEG_VIDEO_STREAM = new byte[20000];
camTexture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);

//运行在Update函数中的主要代码

if(updateScreen){
camTexture.LoadImage(JPEG_VIDEO_STREAM);
Sprite tempSprite = Sprite.Create(camTexture, new Rect(0, 0, camTexture.width, camTexture.height), Vector2.zero, 0);
screenDisplay.sprite = tempSprite;
updateScreen = false;
}

以上代码目前需要执行三个步骤才能将图像显示到屏幕上:

byte数组 -> Texture2D -> Sprite -> UI.Image

但我想让它看起来像这样:byte数组 -> Texture2D-> UI.Image

我想直接将Texture2D写入到UI.Image而不是创建一个新的Sprite,因为我认为每次调用Sprite.Create(camTexture, new Rect(0, 0, camTexture.width, camTexture.height), Vector2.zero, 0);都会分配新的内存。我查看了 Unity 文档,但没有找到其他方法。

我的问题是:

  1. 如何将camTexture(Texture2D)分配给屏幕screenDisplay(UI.Image),而不是先转换为Sprite?

  2. 每次调用Sprite.Create时是否会分配新的内存?

  3. 如果有一个解决方案,那么在性能内存管理方面,这个解决方案是否更好

注意:我没有计划使用OnGUI来绘制Texture2D。我想使用新的 Unity UI 进行操作。谢谢。

编辑: 根据Joe的答案,最终代码如下:

RawImage screenDisplay;
if(updateScreen){
camTexture.LoadImage(JPEG_VIDEO_STREAM);
screenDisplay.texture = camTexture;
updateScreen = false;
}

不再需要Sprite。

这里有机会使用 RawImage 吗? - Fattie
现场,我要更改的图像是一种Image类型而不是RawImage。但是如果可以将RawImage或Image强制转换或甚至直接显示RawImage到屏幕上,那么我也可以接受。 - Programmer
我刚刚阅读了这篇文章http://answers.unity3d.com/questions/1070280/raw-image-vs-image.html,看起来正是我所需要的。请继续回答。 - Programmer
谢天谢地...迫不及待想看你如何实现这个。 - Fattie
请问与UI面板中的MovieTexture相关的问题是什么? - Fattie
我没有使用MovieTexture,但是你的答案正好提供了我想要的。 - Programmer
1个回答

3

我认为,通过使用RawImage而不是Image,可以实现这一点。

我广泛使用RawImage,因为我们必须“显示PNG”,这样更容易。

考虑一个非常方便的技巧:

只需从导入的微不足道的灰色PNG开始,然后进行修改,而不是试图从头开始构建?

我发现一个有趣的好奇心是:通常要镜像一张图片,你只需要将x或y缩放为-1。除非已经修复,否则Unity存在一个问题,这对于RawImage无法正常工作。

    // currently in Unity, the ONLY way to mirror a RAW image is by fooling with
    // the uvRect. changing the scale is completely broken.

    if ( shouldWeMirror )
      rawImage.uvRect = new Rect(1,0,-1,1); // means mirror
    else
      rawImage.uvRect = new Rect(0,0,1,1);  // means no flip

另一个有趣的因素。因此,许多Unity项目甚至到2017年仍然使用卓越的2dToolkit。它可以立即解决这类问题。


谢谢。我删除了Image并创建了RawImage,就这样。感谢您提供镜像和翻转的内容。我正在为此制作的相机支持翻转/镜像图像的命令,但其他一些相机不支持,您的示例将有助于实现该功能。 - Programmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接