Unity—屏幕截图(拍照和自拍功能)

工作需求,做个记录。

首先在场景中添加一个自拍相机,对着自己。再用脚控制本切换。

需要注意的是设置这个 Depth 的值尽量小一点,否则切换相机时会发生视角错乱。 

然后设置一个RawImage用来显示截的图片。设置如下图:

再加一个切换相机的按钮,就不展示了,普通按钮就行。

脚本:

    /// <summary>
    /// 拍照按钮
    /// </summary>
    private void OnPhotoHandler()
    {
        timer = 3;
        isSelfie = false;
        photoCamera = Camera.main;//主相机
        //修正自拍相机的位置
        selfieCamera.transform.position = new Vector3(selfieCamera.transform.position.x, selfieTarget.position.y + 1.8f, selfieCamera.transform.position.z);
        StartCoroutine(nameof(TakePhoto));

    }

    /// <summary>
    /// 切换相机(自拍)
    /// </summary>
    private void OnSwitchCamera()
    {
        isSelfie = !isSelfie;
        timer = 3;
        photoCamera = isSelfie ? selfieCamera : Camera.main;//主相机和自拍相机切换
        StopCoroutine(nameof(TakePhoto));
        StartCoroutine(nameof(TakePhoto));
    }
    /// <summary>
    /// 屏幕截图
    /// </summary>
    /// <returns></returns>
    public Texture2D ScreenShot(Camera camera, Rect rect)
    {
        RenderTexture rt = new RenderTexture((int)rect.width, (int)rect.height, 50);
        camera.targetTexture = rt;
        camera.Render();
        RenderTexture.active = rt;
        Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.ARGB32, false);
        //颜色纹理格式,每个通道8位。
        screenShot.ReadPixels(rect, 0, 0);//从屏幕读取像素到保存的纹理数据中。
        screenShot.Apply();//实际上应用所有以前的SetPixel和SetPixels更改。
        camera.targetTexture = null;
        RenderTexture.active = null;
        Destroy(rt);
        byte[] bytes = screenShot.EncodeToJPG();//设置文件类型
        string fileName = DateTime.Now.ToString("yyyyMMddhhmmss") + ".jpg";
        GameLogger.Log(fileName);

        //NativeGallery 是个小插件,本地保存用的,否则要根据设备的不同
        //设置各种路径啥的很麻烦,这个很好用。
        NativeGallery.SaveImageToGallery(bytes, "MetaApePicturs", fileName);

        return screenShot;
    }


    /// <summary>
    /// 拍照(调用的是这个方法)
    /// </summary>
    IEnumerator TakePhoto()
    {
        btn_Photo.interactable = false; //倒计时开始时关闭拍照按钮
        btn_ReverseCamera.gameObject.SetActive(true); //切换相机按钮显示
        //当时间大于零时 执行循环  时间到了 退出循环
        do
        {
            //输出时间
            txt_PhotoCD.text = timer.ToString();
            //并通过协程隔一秒执行一次 累减时间
            yield return new WaitForSeconds(1);
            timer--;
        }
        while (timer > 0);
        btn_ReverseCamera.gameObject.SetActive(false);//切换相机按钮关闭
        int ratio = 1;
        Rect rect = new Rect(0, 0, (int)Screen.width / ratio, (int)Screen.height / ratio);//图片大小取决于ratio的大小
        rawImage.texture = ScreenShot(photoCamera, rect);//截图
        rawImage.enabled = true;
        rawImage.rectTransform.DOScale(0.8f, 2f).SetEase(Ease.Linear).OnComplete(() =>
        {
            rawImage.texture = null;
            rawImage.enabled = false;
            rawImage.rectTransform.DOScale(1f, 0.1f);
            btn_Photo.interactable = true;
        });
    }

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值