【问题标题】:Using player's face from camera as a sprite in unity统一使用相机中的玩家面部作为精灵
【发布时间】:2017-04-02 21:17:03
【问题描述】:

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

【问题讨论】:

    标签: android unity3d camera sprite


    【解决方案1】:

    按照this question的回答,您可以从Android相机中检索图片并将其保存为纹理。然后你使用一个 Texture2D 包含你的掩码(假设中间有一个带有 alpha 的圆圈)来检查你想要保存哪个 byte 以及哪个 byte 将是透明的。不要忘记将此 Texture2D 导入属性设置为 Advanced 并选中 Read/Write enabled。最后,您可以使用 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());
    }
    

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

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

    希望对你有帮助,

    【讨论】:

      猜你喜欢
      • 2017-03-12
      • 1970-01-01
      • 1970-01-01
      • 2022-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多