Android 使用播放器';照片中的脸是一个团结的精灵
有没有办法拍一张玩家的照片,然后在脸上剪一个精灵之类的东西? 就像那些将你的脸添加到身体中的应用程序一样,但是脸会以某种方式存储。下面的答案是,你可以从Android摄像头中检索图片并将其保存为纹理。然后使用包含遮罩的Texture2D(例如中间有一个圆圈,周围有alpha)来检查要保存的字节以及透明的字节。不要忘记将此Texture2D导入属性设置为“高级”,并选中“已启用读/写”。最后,您可以使用Unity WWW class或System.IO.ReadAllBytes将新创建的图片作为精灵加载 下面是此功能的快速实现:Android 使用播放器';照片中的脸是一个团结的精灵,android,unity3d,camera,sprite,Android,Unity3d,Camera,Sprite,有没有办法拍一张玩家的照片,然后在脸上剪一个精灵之类的东西? 就像那些将你的脸添加到身体中的应用程序一样,但是脸会以某种方式存储。下面的答案是,你可以从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();
}
(警告:未测试的代码)
另外,请记住,在提问之前尽量提供您已经尝试过的内容:这有助于其他用户了解您想要实现的内容和方式
希望这有帮助