项目上要针对一个UGUI创建的UI窗体截图,但是不能截取窗体外的内容。
按照我的思路就采用
Texture2D tex = new Texture2D((int)宽度, (int)高度, TextureFormat.RGB24, false);
tex.ReadPixels(new Rect(左下角X, 左下角Y, 宽度, 高度), 0, 0);
tex.Apply();
的方法来实现,但是实际中发现UI中的RectTransform的宽度和高度不正确,所以思考了一个下午,才发现原来是Canvas有一个缩放属性,而且我的项目采用了scale with scree sizi。所以导致宽度高度还有左下角X左下角Y不正确。对此我修改了方法:
public void 截屏测试()
{
StartCoroutine(截屏());
}
[SerializeField]
Image 测试显示截图用的IMAGE;
[SerializeField]
Image 要抓屏幕的物体;
[SerializeField]
Canvas 主画布;
IEnumerator 截屏()
{
//等待渲染完成
yield return new WaitForEndOfFrame();
RectTransform 目标 = 要抓屏幕的物体.GetComponent<RectTransform>();
// 计算出这个物体在屏幕的宽度(因为画布是经过缩放的,所以用实际宽度* 画布的缩放率)
int 宽度 = (int)(目标.rect.width * 主画布.scaleFactor);
int 高度 = (int)(目标.rect.height * 主画布.scaleFactor);
Texture2D tex = new Texture2D((int)宽度, (int)高度, TextureFormat.RGB24, false);
//通过中心点的位置和.transform.position可以计算出UI左下角的位置来
//要抓屏幕的物体.transform.position-这个参数其实就是UI控件的锚点所在屏幕位置
//RectTransform.rect.xMin代表左下角相对中心的实际位置(空间坐标?)所以乘以缩放率可以得到左下角与中心位置的屏幕距离
//在UI控件的锚点的屏幕坐标上加上差距 即的到左下角的屏幕位置
float 左下角X = 要抓屏幕的物体.transform.position.x + 目标.rect.xMin * 主画布.scaleFactor;
float 左下角Y = 要抓屏幕的物体.transform.position.y + 目标.rect.yMin * 主画布.scaleFactor;
//用新建立的Texture2D,读取屏幕像素。
tex.ReadPixels(new Rect(左下角X, 左下角Y, 宽度, 高度), 0, 0);
//执行读取操作
tex.Apply();
//后面就是将Texture2D转换为sprinte并显示出来
Sprite 生成的 = Sprite.Create(tex, new Rect(0, 0, 宽度, 高度), Vector2.zero);
测试显示截图用的IMAGE.sprite = 生成的;
//也可以保存成PNG文件,今后使用
byte[] 数据 = tex.EncodeToPNG();
System.IO.File.WriteAllBytes("文件路径和名字", 数据);
}
————————————————
版权声明:本文为优快云博主「失恋王子」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/qq_33347809/article/details/74587012