You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity ARCore调用AcquireCameraImageBytes保存图像仅得灰色方块求助

解决Unity ARCore AcquireCameraImageBytes保存图像为灰色方块的问题

我明白你现在的困扰——按照JordanRobinson的步骤尝试保存ARCore相机图像,结果却只得到灰色空白方块,而且搞不清纹理读取器和后续步骤的关联。我来帮你拆解关键环节,补上你可能遗漏的步骤:

一、理清纹理读取器与图像获取的关联

步骤2的纹理读取器(TextureReader)核心作用是处理ARCore相机输出的YUV格式原始数据——AcquireCameraImageBytes()拿到的是YUV_420_888格式的字节流,直接当成RGB数据保存会完全失真;而纹理读取器就是负责把YUV数据正确解码成可渲染、可保存的RGB/RGBA纹理。它和步骤3(获取图像字节)的关联是:你需要用读取器来转换获取到的YUV字节,而不是直接把原始字节存成图像。

二、你可能遗漏的关键完整流程

下面是对应你操作的补全步骤,包含可运行的代码示例:

1. 初始化纹理读取器与核心变量

先在脚本里定义必要的组件和存储变量,避免后续处理出现空引用:

using UnityEngine;
using GoogleARCore;
using System.IO;

public class ARCameraCapture : MonoBehaviour
{
    private TextureReader _textureReader;
    private Texture2D _processedCameraTexture;
    private bool _isCapturing = false; // 避免重复触发保存

    void Start()
    {
        // 初始化纹理读取器,指定输出为RGBA32格式(适配后续PNG保存)
        _textureReader = new TextureReader(TextureReaderApi.OutputFormat.RGBA32);
    }
}

2. 在Update中正确获取并解码相机图像

你已经调用了AcquireCameraImageBytes(),但缺少用纹理读取器解码的关键步骤,还要注意必须在图像的生命周期内处理数据:

void Update()
{
    if (_isCapturing) return;

    // 获取相机图像字节,用using自动释放资源
    using (var cameraImage = Frame.CameraImage.AcquireCameraImageBytes())
    {
        if (!cameraImage.IsAvailable) return;

        // 用纹理读取器把YUV数据转换成RGBA纹理
        _textureReader.UpdateTexture(cameraImage, ref _processedCameraTexture);
        
        // 这里可以改成你需要的触发条件(比如按键、手势)
        if (Input.GetKeyDown(KeyCode.Space))
        {
            SaveCapturedImage();
            _isCapturing = true;
        }
    }
}

3. 正确保存处理后的纹理

之前的灰色问题大概率是因为直接保存了未解码的YUV字节,现在用转换后的RGBA纹理来保存:

void SaveCapturedImage()
{
    if (_processedCameraTexture == null) return;

    // 将纹理编码为PNG字节
    byte[] pngBytes = _processedCameraTexture.EncodeToPNG();
    
    // 指定保存路径(示例为Unity持久化存储目录)
    string savePath = Path.Combine(Application.persistentDataPath, "AR_Camera_Capture.png");
    
    // 写入文件
    File.WriteAllBytes(savePath, pngBytes);
    
    Debug.Log($"图像已成功保存至:{savePath}");
}

4. 必须注意的权限与细节

  • 权限申请:Android平台要在Manifest中添加相机权限(android.permission.CAMERA)和存储权限(android.permission.WRITE_EXTERNAL_STORAGE),Unity中也需要在PlayerSettings里开启权限请求。
  • 纹理生命周期:_processedCameraTexture会被TextureReader.UpdateTexture()自动创建和更新,不需要手动初始化。
  • 性能优化:不要每一帧都触发保存,会严重影响AR运行流畅度,建议用按键、手势等方式触发单次保存。

三、为什么之前会出现灰色方块?

你直接保存AcquireCameraImageBytes()拿到的原始YUV数据时,系统会默认把它当成RGB格式解析,但YUV的亮度、色度通道排布和RGB完全不匹配,最终就会显示成无意义的灰色空白。必须通过纹理读取器完成YUV到RGB的格式转换,才能得到正常的相机图像。

内容的提问来源于stack exchange,提问作者Subha Andy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:06:57