Unity中生成相机照片并保存到本地的详细教程

这篇具有很好参考价值的文章主要介绍了Unity中生成相机照片并保存到本地的详细教程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

在游戏和应用程序开发中,有时候需要通过代码在Unity中使用相机捕捉当前场景或特定视角的照片,并将其保存到本地。本教程将演示如何通过C#代码实现这一功能。


一、代码基本结构

 /// <summary>
    /// 生成相机照片并保存
    /// </summary>
    /// <param name="photographyCamera">相机</param>
    /// <param name="width">图像宽度</param>
    /// <param name="height">图像高度</param>
    /// <param name="path">保存路径</param>
    /// <param name="imageName">保存图片名字</param>
    public void CreateCameraCaptureAndSaveLocal(Camera photographyCamera,int width,int height, string path, string imageName){
        // 销毁之前的 RenderTexture 和 Texture2D
        if (photographyCamera.targetTexture != null){
            RenderTexture.ReleaseTemporary(photographyCamera.targetTexture);
            photographyCamera.targetTexture = null;
            RenderTexture.active = null;
        }

        // 创建 RenderTexture
        RenderTexture rt = new RenderTexture(width, height, 16, RenderTextureFormat.ARGB32);
        photographyCamera.targetTexture = rt;
        GL.Clear(true, true, Color.clear); // 清除颜色和深度缓冲区
        photographyCamera.Render();
        RenderTexture.active = rt;

        // 创建 Texture2D 并读取图像数据
        Texture2D image = new Texture2D(width, height, TextureFormat.ARGB32, false);
        image.ReadPixels(new Rect(0, 0, width, height), 0, 0);
        image.Apply();

        // 重要:将 targetTexture 设置为 null,以便相机继续渲染到主屏幕
        photographyCamera.targetTexture = null;
        RenderTexture.active = null;

        // 检查保存路径是否为空或无效
        if (string.IsNullOrEmpty(path)){
            Debug.LogError("Invalid save path.");
            return;
        }

        // 如果文件夹不存在,则创建文件夹
        if (!Directory.Exists(path)){
            Directory.CreateDirectory(path);
        }

        // 保存图像到本地文件夹

        byte[] bytes = image.EncodeToJPG();
        if (bytes != null){
            string savePath = Path.Combine(path, imageName + ".jpg");

            try{
                File.WriteAllBytes(savePath, bytes);
                Debug.Log("Image saved successfully: " + savePath);
            }
            catch (Exception e){
                Debug.LogError("Error saving image: " + e.Message);
            }
        }
        else{
            Debug.LogError("Failed to encode image to JPG.");
        }
    }

二、使用步骤

1.函数定义

/// <summary>
/// 生成相机照片并保存
/// </summary>
/// <param name="photographyCamera">相机</param>
/// <param name="width">图像宽度</param>
/// <param name="height">图像高度</param>
/// <param name="path">保存路径</param>
/// <param name="imageName">保存图片名字</param>
public void CreateCameraCaptureAndSaveLocal(Camera photographyCamera, int width, int height, string path, string imageName){

此函数的目标是使用给定的相机(photographyCamera)生成图像,并将图像保存到指定路径。函数有五个参数,分别是相机、图像宽度、图像高度、保存路径和保存图片的名字

2.销毁之前的 RenderTexture 和 Texture2D

// 销毁之前的 RenderTexture 和 Texture2D
if (photographyCamera.targetTexture != null){
    RenderTexture.ReleaseTemporary(photographyCamera.targetTexture);
    photographyCamera.targetTexture = null;
    RenderTexture.active = null;
}

此段代码确保在生成新图像前,释放之前的渲染纹理和2D纹理,以防止内存泄漏。

3.创建 RenderTexture

// 创建 RenderTexture
RenderTexture rt = new RenderTexture(width, height, 16, RenderTextureFormat.ARGB32);
photographyCamera.targetTexture = rt;
GL.Clear(true, true, Color.clear); // 清除颜色和深度缓冲区,防止图像叠加
photographyCamera.Render();
RenderTexture.active = rt;

在这里,我们创建了一个新的RenderTexture(rt),用于保存相机渲染的图像。相机的目标渲染纹理被设置为这个新创建的纹理,然后相机被渲染,将图像绘制到rt上。

4.创建 Texture2D 并读取图像数据

// 创建 Texture2D 并读取图像数据
Texture2D image = new Texture2D(width, height, TextureFormat.ARGB32, false);
image.ReadPixels(new Rect(0, 0, width, height), 0, 0);
image.Apply();


在这一步,我们创建了一个新的Texture2D(image),并使用ReadPixels方法从RenderTexture中读取像素数据。Apply方法确保纹理被正确应用。

5.重要步骤:设置 targetTexture 为 null

// 重要:将 targetTexture 设置为 null,以便相机继续渲染到主屏幕
photographyCamera.targetTexture = null;
RenderTexture.active = null;


这一步非常重要,因为它将相机的目标渲染纹理设置为null,以确保相机继续在主屏幕上渲染。这是在生成图像后必须执行的步骤。

6.检查保存路径是否有效

// 检查保存路径是否为空或无效
if (string.IsNullOrEmpty(path)){
    Debug.LogError("Invalid save path.");
    return;
}

// 如果文件夹不存在,则创建文件夹
if (!Directory.Exists(path)){
    Directory.CreateDirectory(path);
}

在这里,我们检查用户提供的保存路径是否为空或无效。如果路径无效,将打印错误消息并提前返回,避免后续操作导致错误。
如果保存路径对应的文件夹不存在,我们会创建这个文件夹。这样可以确保保存图像的目标路径是有效的。

7.保存图像到本地文件夹

// 保存图像到本地文件夹
byte[] bytes = image.EncodeToJPG();
if (bytes != null){
    string savePath = Path.Combine(path, imageName + ".jpg");

    try{
        File.WriteAllBytes(savePath, bytes);
        Debug.Log("Image saved successfully: " + savePath);
    }
    catch (Exception e){
        Debug.LogError("Error saving image: " + e.Message);
    }

    // 保存文件路径到特定键值
    _rc.WriteKey("takingPhotosPath", savePath);
}
else{
    Debug.LogError("Failed to encode image to JPG.");
}


在这里,我们将Texture2D中的图像数据编码为JPG格式的字节数组,并将其写入指定路径的文件中。如果保存成功,将打印成功消息并将文件路径保存到特定的键值。如果保存失败,将打印错误消息。


总结

通过这个函数,你可以在游戏开发中轻松实现相机捕捉和图像保存的功能,方便用于创建截图、快照等场景。文章来源地址https://www.toymoban.com/news/detail-801593.html

到了这里,关于Unity中生成相机照片并保存到本地的详细教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【python】爬取斗鱼直播照片保存到本地目录【附源码+文末免费送书】

    英杰社区 https://bbs.csdn.net/topics/617804998     这篇博客将介绍如何使用Python编写一个爬虫程序,从斗鱼直播网站上获取图片信息并保存到本地。我们将使用 request s 模块发送HTTP请求和接收响应,以及 os 模块处理文件和目录操作。         如果出现模块报错         进入控

    2024年02月04日
    浏览(35)
  • Unity3D相机围绕物体自由旋转

    写了一个相机围绕物体360°自由旋转的脚本,比较实用,分享出来给大家使用,配置如下: Hierarchy界面  LookPovit:为物体Auto Aircraft的中心空对象; AroundPovit:用于相机的空对象,作为父类,主要作用是为了保持与被观察物体的位置一致,可防止Auto Aircraft出现抖动而影响相机

    2024年02月11日
    浏览(66)
  • 【unity3D】如何修改相机的默认视角

    💗 未来的游戏开发程序媛,现在的努力学习菜鸡 💦本专栏是我关于游戏开发的学习笔记 🈶本篇是unity的如何修改相机的默认视角 Game窗口运行的话视角是这样的: 此时Scene窗口的视角是这样的,可以观察到人物变化,但是我现在需要游戏运行起来从Game窗口进行操作来观察

    2024年02月09日
    浏览(39)
  • 【Unity3d】【相机】透视相机UI转换(3DUI+保持屏幕比例)

    0. 基础知识点 正交相机 : 正交相机的的orthographicSize ,是 二分之一的屏幕高度,即 orthographicSize = H/2。 透视相机 : 相机的aspect为相机的视口的宽高比: aspect = W/H 即: W = H * aspect 透视相机的屏幕高度H 随着相机的中心距离和fov变化。公式为: H = distance * tan(fov*0.5) * 2 相机视

    2024年02月04日
    浏览(91)
  • uniapp制作水印相机给图片添加水印并且保存图片至本地

    文件主要分为两大类: 1.代码包文件:代码包文件指的是在项目目录中添加的文件。 2.本地文件:通过调用接口本地产生,或通过网络下载下来,存储到本地的文件。 其中本地文件又分为三种: 1.本地临时文件:临时产生,随时会被回收的文件。运行时最多存储 4GB,结束运

    2024年02月11日
    浏览(55)
  • Unity3D制作一个会移动的方块(还不会移动照相机)

    学习 Unity3D 这么久了,如果你还不会制作一个按下 WASD 就可以移动的方块的话,那么你的学习将没有一点成就感,我学习的时候,我决定 先学习移动 ,这样我就会对 Unity 更加感兴趣,学习起来的动力会更为充足 先创建一个项目,名为move,如果你手头有一个随便乱用的项目

    2024年02月14日
    浏览(49)
  • Unity3D 基础——使用 Mathf.SmoothDamp 函数制作相机的缓冲跟踪效果

    使用 Mathf.SmoothDamp 函数制作相机的缓冲跟踪效果,让物体的移动不是那么僵硬,而是做减速的缓冲效果。将以下的脚本绑定在相机上,然后设定好 target 目标对象,即可看到相机的缓动效果。通过设定 smoothTime 的值,可以调节缓动效果的持续时间。 Mathf-SmoothDamp - Unity 脚本 A

    2024年01月16日
    浏览(53)
  • Baumer工业相机堡盟工业相机如何通过BGAPI SDK将相机图像数据用二进制的方式保存到本地(C++)

    ​ Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具有快速数据传输、低功耗、易于集成以及高度

    2023年04月08日
    浏览(37)
  • Android Studio App开发之使用相机拍摄照片和从相册中选取图片(附源码 超详细必看)

    运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 对于手机拍照的App开发而言,有两种实现方式 1:通过 camera工具联合表面视图SurfaceView自行规划编码细节 2:借助系统相机自动拍照,考虑到多数场景对图片并没有特殊要求,所以使用系统相机更加方便快捷  效果如下 点

    2024年02月11日
    浏览(54)
  • Unity3D实现登陆注册功能,实现本地存储读取

    untiy登录注册功能的实现,可以永久本地存储。C#源代码,也可以用相同的办法存储读取玩家的其他信息或自定义的游戏设置 实现了判断用户名是否存在,密码是否前后一致,密码是否正确等。 这是注册界面功能 以下是登录页功能      

    2024年02月13日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包