【发布时间】:2017-04-02 21:17:03
【问题描述】:
有没有办法获取玩家的照片,然后裁剪脸部以获得精灵或其他东西? 就像将您的脸添加到身体的应用程序一样,但脸会以某种方式存储。
【问题讨论】:
标签: android unity3d camera sprite
有没有办法获取玩家的照片,然后裁剪脸部以获得精灵或其他东西? 就像将您的脸添加到身体的应用程序一样,但脸会以某种方式存储。
【问题讨论】:
标签: android unity3d camera sprite
按照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());
}
(警告:未经测试的代码)
另外请记住,在提问之前尝试提供您已经尝试过的内容:它可以帮助其他用户了解您想要实现的目标和方式。
希望对你有帮助,
【讨论】: