/// <summary>
        /// Loads a <see cref="FieldImage"/> from a <see cref="LightFieldComponent"/> and metadata.
        /// </summary>
        /// <param name="frame">The raw frame component.</param>
        /// <param name="frameMetadata">The raw frame metadata.</param>
        /// <param name="privateMetadata">The private metadata.</param>
        /// <returns>a new instance of the <see cref="FieldImage"/> class.</returns>
        public static FieldImage From(LightFieldComponent frame, Json.FrameMetadata frameMetadata, Json.FrameMetadata privateMetadata = null)
        {
            if (frame == null)
            {
                throw new ArgumentNullException("frame");
            }

            return(new FieldImage(frame, frameMetadata, privateMetadata));
        }
        private FieldImage(LightFieldComponent frame, Json.FrameMetadata frameMetadata, Json.FrameMetadata privateMetadata)
        {
            _metadata        = frameMetadata;
            _privateMetadata = privateMetadata;
            _frameData       = frame.Data;

            _width  = (int)_metadata.Image.Width;
            _height = (int)_metadata.Image.Height;
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="RawImage"/> class from a <see cref="LightFieldComponent"/>.
        /// </summary>
        /// <param name="frame">The raw frame component.</param>
        /// <param name="imageMetadata">The metadata with packing parameters.</param>
        public RawImage(LightFieldComponent frame, Json.FrameImage imageMetadata)
        {
            if (frame == null)
                throw new ArgumentNullException("frame");
            if (frame.Length < 1)
                throw new ArgumentException("Component does not contain any data.", "frame");

            VerifyMetadata(imageMetadata, out _width, out _height);
            _data = Unpack(frame.Data, _width, _height);
        }
        /// <summary>
        /// Loads a <see cref="FieldImage"/> from a <see cref="LightFieldPackage"/>.
        /// </summary>
        /// <param name="package">The package to load the field image from.</param>
        /// <returns>a new instance of the <see cref="FieldImage"/> class.</returns>
        public static FieldImage From(LightFieldPackage package)
        {
            if (package == null)
            {
                throw new ArgumentNullException("package");
            }

            LightFieldComponent metadataComponent = package.GetMetadata().FirstOrDefault();

            if (metadataComponent == null)
            {
                throw new ArgumentException("The package does not contain any metadata.", "package");
            }

            Json.Master master = new Json.Master();
            try { master.LoadFromJson(metadataComponent.GetDataAsString()); }
            catch (FormatException e) { throw new ArgumentException("The package contains invalid metadata.", e); }
            if (master.Picture == null)
            {
                throw new ArgumentException("The package does not contain required metadata.", "package");
            }

            PictureMetadata pictureMetadata = new PictureMetadata(master.Picture);

            LightFieldComponent frameMetadataComponent = package.GetComponent(pictureMetadata.Frame.MetadataReference).FirstOrDefault();

            if (frameMetadataComponent == null)
            {
                throw new ArgumentException("The package does not contain any frame metadata.", "package");
            }

            Json.FrameMetadata frameMetadata = new Json.FrameMetadata();
            try { frameMetadata.LoadFromJson(frameMetadataComponent.GetDataAsString()); }
            catch (FormatException e) { throw new ArgumentException("The package contains invalid metadata.", e); }


            Json.FrameMetadata  privateMetadata          = new Json.FrameMetadata();
            LightFieldComponent privateMetadataComponent = package.GetComponent(pictureMetadata.Frame.PrivateMetadataReference).FirstOrDefault();

            if (privateMetadataComponent != null)
            {
                try { privateMetadata.LoadFromJson(frameMetadataComponent.GetDataAsString()); }
                catch (FormatException) { }
            }

            LightFieldComponent frameComponent = package.GetComponent(pictureMetadata.Frame.ImageReference).FirstOrDefault();

            if (frameComponent == null)
            {
                throw new ArgumentException("The package does not contain the frame data.", "package");
            }

            return(new FieldImage(frameComponent, frameMetadata, privateMetadata));
        }