示例#1
0
        public static byte[] GetCameraImage(ARInterface arInterface)
        {
            var cameraImage = new ARInterface.CameraImage();

            if (arInterface.TryGetCameraImage(ref cameraImage))
            {
                var displayTransform = arInterface.GetDisplayTransform();
                var textureSize      = displayTransform.MultiplyVector(new Vector3(cameraImage.width, cameraImage.height));
                var textureWidth     = Math.Abs((int)textureSize.x);
                var textureHeight    = Math.Abs((int)textureSize.y);
                var inverse          = displayTransform.inverse;
                var texture          = new Texture2D(textureWidth, textureHeight, TextureFormat.RGB24, false);
                for (int j = 0; j < cameraImage.height; j++)
                {
                    for (var i = 0; i < cameraImage.width; i++)
                    {
                        var textureIdx = inverse.MultiplyVector(new Vector3(i, j));
                        var x          = textureWidth - Math.Abs((int)textureIdx.x) - 1;
                        var y          = textureHeight - Math.Abs((int)textureIdx.y) - 1;
                        var idxY       = j * cameraImage.width + i;
                        var idxUV      = j / 2 * cameraImage.width / 2 + i / 2;
                        texture.SetPixel(x, y, YUVtoRGB(cameraImage.y[idxY], cameraImage.uv[idxUV * 2], cameraImage.uv[idxUV * 2 + 1]));
                    }
                }
                texture.Apply();
                var png = texture.EncodeToPNG();
                return(png);
            }

            return(null);
        }
示例#2
0
    private void OnGUI()
    {
        if (GUILayout.Button("Take Photo"))
        {
            var cameraImage = new ARInterface.CameraImage();
            if (_arInterface.TryGetCameraImage(ref cameraImage))
            {
                var displayTransform = _arInterface.GetDisplayTransform();
                var textureSize      = displayTransform.MultiplyVector(new Vector3(cameraImage.width, cameraImage.height));
                var textureWidth     = Math.Abs((int)textureSize.x);
                var textureHeight    = Math.Abs((int)textureSize.y);
                var inverse          = displayTransform.inverse;
                var texture          = new Texture2D(textureWidth, textureHeight, TextureFormat.RGB24, false);
                for (int j = 0; j < cameraImage.height; j++)
                {
                    for (var i = 0; i < cameraImage.width; i++)
                    {
                        var textureIdx = inverse.MultiplyVector(new Vector3(i, j));
                        var x          = textureWidth - Math.Abs((int)textureIdx.x) - 1;
                        var y          = textureHeight - Math.Abs((int)textureIdx.y) - 1;
                        var idxY       = j * cameraImage.width + i;
                        var idxUV      = j / 2 * cameraImage.width / 2 + i / 2;
                        texture.SetPixel(x, y, YUVtoRGB(cameraImage.y[idxY], cameraImage.uv[idxUV * 2], cameraImage.uv[idxUV * 2 + 1]));
                    }
                }
                texture.Apply();
                var png = texture.EncodeToPNG();
                File.WriteAllBytes(Application.persistentDataPath + "/output.png", png);

                File.WriteAllText(Application.persistentDataPath + "/output.json", JsonUtility.ToJson(CaptureInstance.fromArInterface(_arInterface)));
            }
        }

        if (GUILayout.Button("Open Photo"))
        {
            var plane = GameObject.CreatePrimitive(PrimitiveType.Quad);

            var png     = File.ReadAllBytes(Application.persistentDataPath + "/output.png");
            var texture = new Texture2D(0, 0, TextureFormat.RGB24, false);
            texture.LoadImage(png);
            plane.GetComponent <MeshRenderer>().material.mainTexture = texture;

            var json = File.ReadAllText(Application.persistentDataPath + "/output.json");
            var meta = JsonUtility.FromJson <CaptureInstance>(json);
            plane.transform.localRotation = meta.pose.rotation;
            plane.transform.localScale    = new Vector3(meta.aspect, 1, 1) / 3;
            var offset = meta.pose.rotation * new Vector3(0, 0, 0.5f);
            plane.transform.position = meta.pose.position + offset;
        }
    }