【发布时间】:2021-03-28 02:00:42
【问题描述】:
我有一个 Texture2D,应用在 RawImage 上,取自网络摄像头,我称之为“originalImage”。我想在另一个矩形的位置(称为“cropArea”)的基础上裁剪这个 originalImage 的一个块。基本上,cropArea 是我的 originalImage 的“指南”,我希望用户将手放在其中,这样我就可以为这只手获取另一个图像。
问题是我无法获得 originalImage 相对于cropArea 位置的正确像素。实际裁剪的区域相对于cropArea 的位置有一个偏移量,我无法理解。这是一张显示我的问题的图片(我使用从谷歌获取的随机图像作为 originalImage Texuter2D 而不是我的网络摄像头)
在我的层次结构中,cropArea 作为 originalImage 的子项,当我截取上面的屏幕截图时,它们都是在我的检查器上设置的。
这是我的代码(这是我为重现我的问题而编写的代码,因此该函数中不涉及其他代码):
[SerializeField] private RawImage originalImage;
[SerializeField] private RawImage cropArea;
[SerializeField] private RawImage croppedImage;
void Update() {
if (Input.GetKeyDown(KeyCode.S))
{
Texture2D croppedTexture = new Texture2D((int)cropArea.rectTransform.rect.width, (int)cropArea.rectTransform.rect.height);
Texture2D originalTexture = (Texture2D)originalImage.mainTexture;
croppedTexture.SetPixels(originalTexture.GetPixels((int)cropArea.rectTransform.anchoredPosition.x, (int)cropArea.rectTransform.anchoredPosition.y, (int)cropArea.rectTransform.rect.width, (int)cropArea.rectTransform.rect.height));
croppedTexture.Apply();
croppedImage.texture = croppedTexture;
}
}
再次,我在我的代码中尝试了许多组合,尝试使用 localPosition 或 rect 而不是 anchoredPosition 来获取cropArea的位置,得到不同的结果,但永远不会得到正确的结果。
我想我可能错过了cropArea的位置和从originalImage中获取的像素之间的一些关系,但我真的不知道它是什么。 每次我必须在运行时处理 Unity UI 时都会让我头疼,它是如此的混乱和反直觉。
【问题讨论】:
-
你说的是
UI.Mask吗? -
据我所知 UI.Mask 仅用于显示/隐藏图像的一部分。我要做的是获取由cropArea突出显示的原始图像部分并将其保存在全新的纹理中
标签: unity3d user-interface texture2d