Ejemplo n.º 1
0
        /// <summary>
        /// Saves the texture pack (texture + swatches + xml manifest)
        /// </summary>
        /// <param name="_FileName"></param>
        public void SavePack( System.IO.FileInfo _FileName, TARGET_FORMAT _TargetFormat )
        {
            if ( m_Texture == null )
                throw new Exception( "No calibrated texture has been built! Can't save." );

            System.IO.DirectoryInfo	Dir = _FileName.Directory;
            string	RawFileName = System.IO.Path.GetFileNameWithoutExtension( _FileName.FullName );
            string	Extension = System.IO.Path.GetExtension( _FileName.FullName );

            System.IO.FileInfo		FileName_Manifest = new System.IO.FileInfo( System.IO.Path.Combine( Dir.FullName, RawFileName + ".xml" ) );
            System.IO.FileInfo		FileName_SwatchMin = new System.IO.FileInfo( System.IO.Path.Combine( Dir.FullName, RawFileName + "_Min" + Extension ) );
            System.IO.FileInfo		FileName_SwatchMax = new System.IO.FileInfo( System.IO.Path.Combine( Dir.FullName, RawFileName + "_Max" + Extension ) );
            System.IO.FileInfo		FileName_SwatchAvg = new System.IO.FileInfo( System.IO.Path.Combine( Dir.FullName, RawFileName + "_Avg" + Extension ) );
            System.IO.FileInfo[]	FileName_CustomSwatches = new System.IO.FileInfo[m_CustomSwatches.Length];
            for ( int CustomSwatchIndex=0; CustomSwatchIndex < m_CustomSwatches.Length; CustomSwatchIndex++ )
                FileName_CustomSwatches[CustomSwatchIndex] = new System.IO.FileInfo( System.IO.Path.Combine( Dir.FullName, RawFileName + "_Custom" + CustomSwatchIndex.ToString() + Extension ) );

            //////////////////////////////////////////////////////////////////////////
            // Build image type and format parameters as well as target color profile
            ImageUtility.Bitmap.FILE_TYPE		FileType = ImageUtility.Bitmap.FILE_TYPE.UNKNOWN;
            ImageUtility.Bitmap.FORMAT_FLAGS	Format = ImageUtility.Bitmap.FORMAT_FLAGS.NONE;
            switch ( _TargetFormat )
            {
                case TARGET_FORMAT.PNG8:
                    FileType = ImageUtility.Bitmap.FILE_TYPE.PNG;
                    Format = ImageUtility.Bitmap.FORMAT_FLAGS.SAVE_8BITS_UNORM;
                    break;

                case TARGET_FORMAT.PNG16:
                    FileType = ImageUtility.Bitmap.FILE_TYPE.PNG;
                    Format = ImageUtility.Bitmap.FORMAT_FLAGS.SAVE_16BITS_UNORM;
                    break;

                case TARGET_FORMAT.TIFF:
                    FileType = ImageUtility.Bitmap.FILE_TYPE.TIFF;
                    Format = ImageUtility.Bitmap.FORMAT_FLAGS.SAVE_16BITS_UNORM;
                    break;
            }
            if ( FileType == ImageUtility.Bitmap.FILE_TYPE.UNKNOWN )
                throw new Exception( "Unknown target file format!" );

            //////////////////////////////////////////////////////////////////////////
            // Save textures

            // Save main texture
            SaveImage( m_Texture, _FileName, FileType, Format );

            // Save default swatches
            SaveImage( m_SwatchMin.Texture, FileName_SwatchMin, FileType, Format );
            SaveImage( m_SwatchMax.Texture, FileName_SwatchMax, FileType, Format );
            SaveImage( m_SwatchAvg.Texture, FileName_SwatchAvg, FileType, Format );

            // Save custom swatches
            for ( int CustomSwatchIndex=0; CustomSwatchIndex < m_CustomSwatches.Length; CustomSwatchIndex++ )
                SaveImage( m_CustomSwatches[CustomSwatchIndex].Texture, FileName_CustomSwatches[CustomSwatchIndex], FileType, Format );

            //////////////////////////////////////////////////////////////////////////
            // Prepare the XML manifest
            XmlDocument	Doc = new XmlDocument();

            XmlComment	HeaderComment = Doc.CreateComment(
                "***Do not modify!***\r\n\r\n" +
                "This is a calibrated texture manifest file generated from the uncalibrated image \"" + m_CaptureParameters.SourceImageName + "\"\r\n" +
                "Resulting generated images have been stored using a standard sRGB profile and can be used directly as source or color-picked by artists\r\n" +
                " without any other processing. Colors in the textures will have the proper reflectance (assuming the original image has been properly captured\r\n" +
                " with specular removal using polarization filters) and after sRGB->Linear conversion will be directly useable as reflectance in the lighting equation.\r\n" +
                "The xyY values are given in device-independent xyY color space and can be used as linear-space colors directly.\r\n\r\n" +
                "***Do not modify!***" );
            Doc.AppendChild( HeaderComment );

            XmlElement	Root = Doc.CreateElement( "Manifest" );
            Doc.AppendChild( Root );

            // Save source image infos
            XmlElement	SourceInfosElement = AppendElement( Root, "SourceInfos" );
            SetAttribute( AppendElement( SourceInfosElement, "SourceImageName" ), "Value", m_CaptureParameters.SourceImageName );
            SetAttribute( AppendElement( SourceInfosElement, "ISOSpeed" ), "Value", m_CaptureParameters.ISOSpeed.ToString() );
            SetAttribute( AppendElement( SourceInfosElement, "ShutterSpeed" ), "Value", m_CaptureParameters.ShutterSpeed.ToString() );
            SetAttribute( AppendElement( SourceInfosElement, "Aperture" ), "Value", m_CaptureParameters.Aperture.ToString() );

            SetAttribute( AppendElement( SourceInfosElement, "SpatialCorrection" ), "Status", m_SpatialCorrectionEnabled ? "Enabled" : "Disabled" );
            SetAttribute( AppendElement( SourceInfosElement, "WhiteReflectanceCorrectionFactor" ), "Value", m_WhiteReflectanceCorrectionFactor.ToString() );
            if ( m_WhiteReflectanceReference.z > 0.0f )
                SetAttribute( AppendElement( SourceInfosElement, "WhiteBalance" ), "xyY", m_WhiteReflectanceReference.ToString() );

            SetAttribute( AppendElement( SourceInfosElement, "CropSource" ), "Value", m_CaptureParameters.CropSource.ToString() );
            SetAttribute( AppendElement( SourceInfosElement, "CropRectangleCenter" ), "X", m_CaptureParameters.CropRectangleCenter.x.ToString() ).SetAttribute( "Y", m_CaptureParameters.CropRectangleCenter.y.ToString() );
            SetAttribute( AppendElement( SourceInfosElement, "CropRectangleHalfSize" ), "X", m_CaptureParameters.CropRectangleHalfSize.x.ToString() ).SetAttribute( "Y", m_CaptureParameters.CropRectangleHalfSize.y.ToString() );
            SetAttribute( AppendElement( SourceInfosElement, "CropRectangleRotation" ), "Value", m_CaptureParameters.CropRectangleRotation.ToString() );

            SetAttribute( AppendElement( SourceInfosElement, "SwatchesSize" ), "Width", m_SwatchWidth.ToString() ).SetAttribute( "Height", m_SwatchHeight.ToString() );

            SetAttribute( AppendElement( SourceInfosElement, "TargetFormat" ), "Value", _TargetFormat.ToString() );

            // Save calibrated texture infos
            {
                XmlElement	CalibratedTextureElement = AppendElement( Root, "CalibratedTexture" );
                SetAttribute( CalibratedTextureElement, "Name", _FileName.Name ).SetAttribute( "Width", m_Texture.Width.ToString() ).SetAttribute( "Height", m_Texture.Height.ToString() );

                // Save default swatches
                XmlElement	DefaultSwatchesElement = AppendElement( CalibratedTextureElement, "DefaultSwatches" );
                XmlElement	MinSwatchElement = AppendElement( DefaultSwatchesElement, "Min" );
                SetAttribute( MinSwatchElement, "Name", FileName_SwatchMin.Name );
                m_SwatchMin.Save( this, MinSwatchElement );

                XmlElement	MaxSwatchElement = AppendElement( DefaultSwatchesElement, "Max" );
                SetAttribute( MaxSwatchElement, "Name", FileName_SwatchMax.Name );
                m_SwatchMax.Save( this, MaxSwatchElement );

                XmlElement	AvgSwatchElement = AppendElement( DefaultSwatchesElement, "Avg" );
                SetAttribute( AvgSwatchElement, "Name", FileName_SwatchAvg.Name );
                m_SwatchAvg.Save( this, AvgSwatchElement );
            }

            // Save custom swatches infos
            if ( m_CustomSwatches.Length > 0 )
            {
                XmlElement	CustomSwatchesElement = AppendElement( Root, "CustomSwatches" );
                SetAttribute( CustomSwatchesElement, "Count", m_CustomSwatches.Length.ToString() );
                for ( int CustomSwatchIndex=0; CustomSwatchIndex < m_CustomSwatches.Length; CustomSwatchIndex++ )
                {
                    XmlElement	CustomSwatchElement = AppendElement( CustomSwatchesElement, "Custom"+CustomSwatchIndex.ToString() );
                    SetAttribute( CustomSwatchElement, "Name", FileName_CustomSwatches[CustomSwatchIndex].Name );
                    m_CustomSwatches[CustomSwatchIndex].Save( this, CustomSwatchElement );
                }
            }

            Doc.Save( FileName_Manifest.FullName );
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Saves the texture pack (texture + swatches + xml manifest)
        /// </summary>
        /// <param name="_FileName"></param>
        public void             SavePack(System.IO.FileInfo _FileName, TARGET_FORMAT _TargetFormat)
        {
            if (m_Texture == null)
            {
                throw new Exception("No calibrated texture has been built! Can't save.");
            }

            System.IO.DirectoryInfo Dir = _FileName.Directory;
            string RawFileName          = System.IO.Path.GetFileNameWithoutExtension(_FileName.FullName);
            string Extension            = System.IO.Path.GetExtension(_FileName.FullName);

            System.IO.FileInfo   FileName_Manifest       = new System.IO.FileInfo(System.IO.Path.Combine(Dir.FullName, RawFileName + ".xml"));
            System.IO.FileInfo   FileName_SwatchMin      = new System.IO.FileInfo(System.IO.Path.Combine(Dir.FullName, RawFileName + "_Min" + Extension));
            System.IO.FileInfo   FileName_SwatchMax      = new System.IO.FileInfo(System.IO.Path.Combine(Dir.FullName, RawFileName + "_Max" + Extension));
            System.IO.FileInfo   FileName_SwatchAvg      = new System.IO.FileInfo(System.IO.Path.Combine(Dir.FullName, RawFileName + "_Avg" + Extension));
            System.IO.FileInfo[] FileName_CustomSwatches = new System.IO.FileInfo[m_CustomSwatches.Length];
            for (int CustomSwatchIndex = 0; CustomSwatchIndex < m_CustomSwatches.Length; CustomSwatchIndex++)
            {
                FileName_CustomSwatches[CustomSwatchIndex] = new System.IO.FileInfo(System.IO.Path.Combine(Dir.FullName, RawFileName + "_Custom" + CustomSwatchIndex.ToString() + Extension));
            }


            //////////////////////////////////////////////////////////////////////////
            // Build image type and format parameters as well as target color profile
            ImageUtility.Bitmap.FILE_TYPE    FileType = ImageUtility.Bitmap.FILE_TYPE.UNKNOWN;
            ImageUtility.Bitmap.FORMAT_FLAGS Format   = ImageUtility.Bitmap.FORMAT_FLAGS.NONE;
            switch (_TargetFormat)
            {
            case TARGET_FORMAT.PNG8:
                FileType = ImageUtility.Bitmap.FILE_TYPE.PNG;
                Format   = ImageUtility.Bitmap.FORMAT_FLAGS.SAVE_8BITS_UNORM;
                break;

            case TARGET_FORMAT.PNG16:
                FileType = ImageUtility.Bitmap.FILE_TYPE.PNG;
                Format   = ImageUtility.Bitmap.FORMAT_FLAGS.SAVE_16BITS_UNORM;
                break;

            case TARGET_FORMAT.TIFF:
                FileType = ImageUtility.Bitmap.FILE_TYPE.TIFF;
                Format   = ImageUtility.Bitmap.FORMAT_FLAGS.SAVE_16BITS_UNORM;
                break;
            }
            if (FileType == ImageUtility.Bitmap.FILE_TYPE.UNKNOWN)
            {
                throw new Exception("Unknown target file format!");
            }

            //////////////////////////////////////////////////////////////////////////
            // Save textures

            // Save main texture
            SaveImage(m_Texture, _FileName, FileType, Format);

            // Save default swatches
            SaveImage(m_SwatchMin.Texture, FileName_SwatchMin, FileType, Format);
            SaveImage(m_SwatchMax.Texture, FileName_SwatchMax, FileType, Format);
            SaveImage(m_SwatchAvg.Texture, FileName_SwatchAvg, FileType, Format);

            // Save custom swatches
            for (int CustomSwatchIndex = 0; CustomSwatchIndex < m_CustomSwatches.Length; CustomSwatchIndex++)
            {
                SaveImage(m_CustomSwatches[CustomSwatchIndex].Texture, FileName_CustomSwatches[CustomSwatchIndex], FileType, Format);
            }


            //////////////////////////////////////////////////////////////////////////
            // Prepare the XML manifest
            XmlDocument Doc = new XmlDocument();

            XmlComment HeaderComment = Doc.CreateComment(
                "***Do not modify!***\r\n\r\n" +
                "This is a calibrated texture manifest file generated from the uncalibrated image \"" + m_CaptureParameters.SourceImageName + "\"\r\n" +
                "Resulting generated images have been stored using a standard sRGB profile and can be used directly as source or color-picked by artists\r\n" +
                " without any other processing. Colors in the textures will have the proper reflectance (assuming the original image has been properly captured\r\n" +
                " with specular removal using polarization filters) and after sRGB->Linear conversion will be directly useable as reflectance in the lighting equation.\r\n" +
                "The xyY values are given in device-independent xyY color space and can be used as linear-space colors directly.\r\n\r\n" +
                "***Do not modify!***");

            Doc.AppendChild(HeaderComment);

            XmlElement Root = Doc.CreateElement("Manifest");

            Doc.AppendChild(Root);

            // Save source image infos
            XmlElement SourceInfosElement = AppendElement(Root, "SourceInfos");

            SetAttribute(AppendElement(SourceInfosElement, "SourceImageName"), "Value", m_CaptureParameters.SourceImageName);
            SetAttribute(AppendElement(SourceInfosElement, "ISOSpeed"), "Value", m_CaptureParameters.ISOSpeed.ToString());
            SetAttribute(AppendElement(SourceInfosElement, "ShutterSpeed"), "Value", m_CaptureParameters.ShutterSpeed.ToString());
            SetAttribute(AppendElement(SourceInfosElement, "Aperture"), "Value", m_CaptureParameters.Aperture.ToString());

            SetAttribute(AppendElement(SourceInfosElement, "SpatialCorrection"), "Status", m_SpatialCorrectionEnabled ? "Enabled" : "Disabled");
            SetAttribute(AppendElement(SourceInfosElement, "WhiteReflectanceCorrectionFactor"), "Value", m_WhiteReflectanceCorrectionFactor.ToString());
            if (m_WhiteReflectanceReference.z > 0.0f)
            {
                SetAttribute(AppendElement(SourceInfosElement, "WhiteBalance"), "xyY", m_WhiteReflectanceReference.ToString());
            }

            SetAttribute(AppendElement(SourceInfosElement, "CropSource"), "Value", m_CaptureParameters.CropSource.ToString());
            SetAttribute(AppendElement(SourceInfosElement, "CropRectangleCenter"), "X", m_CaptureParameters.CropRectangleCenter.x.ToString()).SetAttribute("Y", m_CaptureParameters.CropRectangleCenter.y.ToString());
            SetAttribute(AppendElement(SourceInfosElement, "CropRectangleHalfSize"), "X", m_CaptureParameters.CropRectangleHalfSize.x.ToString()).SetAttribute("Y", m_CaptureParameters.CropRectangleHalfSize.y.ToString());
            SetAttribute(AppendElement(SourceInfosElement, "CropRectangleRotation"), "Value", m_CaptureParameters.CropRectangleRotation.ToString());

            SetAttribute(AppendElement(SourceInfosElement, "SwatchesSize"), "Width", m_SwatchWidth.ToString()).SetAttribute("Height", m_SwatchHeight.ToString());

            SetAttribute(AppendElement(SourceInfosElement, "TargetFormat"), "Value", _TargetFormat.ToString());

            // Save calibrated texture infos
            {
                XmlElement CalibratedTextureElement = AppendElement(Root, "CalibratedTexture");
                SetAttribute(CalibratedTextureElement, "Name", _FileName.Name).SetAttribute("Width", m_Texture.Width.ToString()).SetAttribute("Height", m_Texture.Height.ToString());

                // Save default swatches
                XmlElement DefaultSwatchesElement = AppendElement(CalibratedTextureElement, "DefaultSwatches");
                XmlElement MinSwatchElement       = AppendElement(DefaultSwatchesElement, "Min");
                SetAttribute(MinSwatchElement, "Name", FileName_SwatchMin.Name);
                m_SwatchMin.Save(this, MinSwatchElement);

                XmlElement MaxSwatchElement = AppendElement(DefaultSwatchesElement, "Max");
                SetAttribute(MaxSwatchElement, "Name", FileName_SwatchMax.Name);
                m_SwatchMax.Save(this, MaxSwatchElement);

                XmlElement AvgSwatchElement = AppendElement(DefaultSwatchesElement, "Avg");
                SetAttribute(AvgSwatchElement, "Name", FileName_SwatchAvg.Name);
                m_SwatchAvg.Save(this, AvgSwatchElement);
            }

            // Save custom swatches infos
            if (m_CustomSwatches.Length > 0)
            {
                XmlElement CustomSwatchesElement = AppendElement(Root, "CustomSwatches");
                SetAttribute(CustomSwatchesElement, "Count", m_CustomSwatches.Length.ToString());
                for (int CustomSwatchIndex = 0; CustomSwatchIndex < m_CustomSwatches.Length; CustomSwatchIndex++)
                {
                    XmlElement CustomSwatchElement = AppendElement(CustomSwatchesElement, "Custom" + CustomSwatchIndex.ToString());
                    SetAttribute(CustomSwatchElement, "Name", FileName_CustomSwatches[CustomSwatchIndex].Name);
                    m_CustomSwatches[CustomSwatchIndex].Save(this, CustomSwatchElement);
                }
            }

            Doc.Save(FileName_Manifest.FullName);
        }