使用来自相机的玩家面部作为团结的精灵

时间:2017-04-02 21:17:03

标签: android unity3d camera sprite

有没有办法获得玩家的照片,然后为精灵或其他东西裁剪脸部? 就像将脸部添加到身体的应用程序一样,脸部也会以某种方式存储。

1 个答案:

答案 0 :(得分:0)

this question回答后,您可以从Android相机检索图片并将其另存为纹理。然后你使用一个 Texture2D 包含你的面具(让我们用中间的圆圈表示围绕它的alpha)来检查你要保存哪个字节以及< em> byte 将是透明的。不要忘记将 Texture2D 导入属性设置为高级,然后选中读/写启用。最后,您可以使用Unity WWW 类或 System.IO.ReadAllBytes 将新创建的图片作为精灵加载。

以下是对此的快速实现:

[SerializeField]
private Texture2D maskTexture;

private WebCamTexture webCamTexture;

protected void Start()
{
    GetComponent<RawImage>().rectTransform.sizeDelta = new Vector2(maskTexture.width, maskTexture.height);

    webCamTexture = new WebCamTexture();
    GetComponent<Renderer>().material.mainTexture = webCamTexture;
    webCamTexture.Play();
}

public void SavePicture()
{
    StartCoroutine(SavePictureCoroutine());
}

private IEnumerator SavePictureCoroutine()
{
    yield return new WaitForEndOfFrame();

    RawImage rawImageToRead = GetComponent<RawImage>();

    //This is to save the current RenderTexture: RenderTexture.GetTemporary() and RenderTexture.ReleaseTemporary() can also be used
    RenderTexture previousRenderTexture = RenderTexture.active;
    RenderTexture.active = rawImageToRead.texture as RenderTexture;
    Texture2D renderedTexture = new Texture2D(maskTexture.width, maskTexture.height, TextureFormat.ARGB32, false);
    renderedTexture.ReadPixels(new Rect(Screen.width * 0.5f - maskTexture.width * 0.5f, Screen.height * 0.5f - maskTexture.height * 0.5f, renderedTexture.width, renderedTexture.height), 0, 0);
    renderedTexture.Apply();
    RenderTexture.active = previousRenderTexture;
    //----

    for(int i = 0; i < renderedTexture.width; i++)
    {
        for(int j = 0; j < renderedTexture.height; j++)
        {
            if(maskTexture.GetPixel(i, j).a > 0.5f)
            {
                renderedTexture.SetPixel(i, j, renderedTexture.GetPixel(i, j));
            }
            else
            {
                renderedTexture.SetPixel(i, j, new Color(0.0f, 0.0f, 0.0f, 0.0f));
            }
        }
    }
    renderedTexture.Apply();
    yield return renderedTexture;
    File.WriteAllBytes(Path.Combine(Application.dataPath, "YOUR_FILE_NAME"), renderedTexture.EncodeToPNG());
}

(警告:未经测试的代码)

另外请记住在提出问题之前尝试提供您已经尝试过的内容:它可以帮助其他用户了解您希望实现的目标和方式。

希望这有帮助,