Android 使用播放器';照片中的脸是一个团结的精灵

Android 使用播放器';照片中的脸是一个团结的精灵,android,unity3d,camera,sprite,Android,Unity3d,Camera,Sprite,有没有办法拍一张玩家的照片,然后在脸上剪一个精灵之类的东西? 就像那些将你的脸添加到身体中的应用程序一样,但是脸会以某种方式存储。下面的答案是,你可以从Android摄像头中检索图片并将其保存为纹理。然后使用包含遮罩的Texture2D(例如中间有一个圆圈,周围有alpha)来检查要保存的字节以及透明的字节。不要忘记将此Texture2D导入属性设置为“高级”,并选中“已启用读/写”。最后,您可以使用Unity WWW class或System.IO.ReadAllBytes将新创建的图片作为精

有没有办法拍一张玩家的照片,然后在脸上剪一个精灵之类的东西? 就像那些将你的脸添加到身体中的应用程序一样,但是脸会以某种方式存储。

下面的答案是,你可以从Android摄像头中检索图片并将其保存为纹理。然后使用包含遮罩的Texture2D(例如中间有一个圆圈,周围有alpha)来检查要保存的字节以及透明的字节。不要忘记将此Texture2D导入属性设置为“高级”,并选中“已启用读/写”。最后,您可以使用Unity WWW class或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());
}
[序列化字段]
私有纹理2d maskTexture;
私有网络摄像机纹理网络摄像机纹理;
受保护的void Start()
{
GetComponent().rectTransform.sizeDelta=新向量2(maskTexture.width,maskTexture.height);
webCamTexture=新的webCamTexture();
GetComponent().material.mainTexture=webCamTexture;
webCamTexture.Play();
}
公共图片()
{
start例程(savePictureCootine());
}
私有IEnumerator保存图片例程()
{
返回新的WaitForEndOfFrame();
RawImage rawImageToRead=GetComponent();
//这是为了保存当前的RenderTexture:RenderTexture.GetTemporary()和RenderTexture.ReleaseTemporary()也可以使用
RenderTexture previousRenderTexture=RenderTexture.active;
RenderTexture.active=rawmagetoread.texture作为RenderTexture;
Texture2D renderedTexture=新的Texture2D(maskTexture.width、maskTexture.height、TextureFormat.ARGB32,false);
RenderTexture.ReadPixels(新矩形(Screen.width*0.5f-maskTexture.width*0.5f,Screen.height*0.5f-maskTexture.height*0.5f,renderTexture.width,renderedTexture.height),0,0);
renderedTexture.Apply();
RenderTexture.active=先前的RenderTexture;
//----
对于(int i=0;i0.5f)
{
renderedTexture.SetPixel(i,j,renderedTexture.GetPixel(i,j));
}
其他的
{
设置像素(i,j,新颜色(0.0f,0.0f,0.0f,0.0f));
}
}
}
renderedTexture.Apply();
产生返回渲染纹理;
writealBytes(Path.Combine(Application.dataPath,“您的文件名”)、renderTexture.EncodeToPNG();
}
(警告:未测试的代码)

另外,请记住,在提问之前尽量提供您已经尝试过的内容:这有助于其他用户了解您想要实现的内容和方式

希望这有帮助