Esempio n. 1
0
 /// <summary>
 /// Saves a texture to disk
 /// </summary>
 /// <param name="_Texture"></param>
 /// <param name="_FileName"></param>
 /// <param name="_FileType"></param>
 /// <param name="_Format"></param>
 private void    SaveImage(ImageUtility.Bitmap _Texture, System.IO.FileInfo _FileName, ImageUtility.Bitmap.FILE_TYPE _FileType, ImageUtility.Bitmap.FORMAT_FLAGS _Format)
 {
     using (System.IO.FileStream S = _FileName.Create())
         _Texture.Save(S, _FileType, _Format, null);
 }
Esempio 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);
        }