예제 #1
0
        private string SaveTiff(FileSaveInfo fileSaveInfo)
        {
            Directory.CreateDirectory(Path.GetDirectoryName(fileSaveInfo.FilePath));
            string uniquePath = Utility.Utility.GetUniqueFilePath(fileSaveInfo.FilePath + ".tif");

            using (FileStream fs = new FileStream(uniquePath, FileMode.Create)) {
                TiffBitmapEncoder encoder = new TiffBitmapEncoder();

                switch (fileSaveInfo.TIFFCompressionType)
                {
                case TIFFCompressionTypeEnum.LZW:
                    encoder.Compression = TiffCompressOption.Lzw;
                    break;

                case TIFFCompressionTypeEnum.ZIP:
                    encoder.Compression = TiffCompressOption.Zip;
                    break;
                }

                encoder.Frames.Add(BitmapFrame.Create(RenderBitmapSource()));
                encoder.Save(fs);
            }

            return(uniquePath);
        }
예제 #2
0
        private Task <string> SaveToDiskAsync(FileSaveInfo fileSaveInfo, CancellationToken cancelToken, bool forceFileType = false)
        {
            return(Task.Run(() => {
                string path = string.Empty;
                fileSaveInfo.FilePath = Path.Combine(fileSaveInfo.FilePath, Guid.NewGuid().ToString());

                if (!forceFileType && Data.RAWData != null)
                {
                    fileSaveInfo.FileType = FileTypeEnum.RAW;
                    path = SaveRAW(fileSaveInfo.FilePath);
                }
                else
                {
                    switch (fileSaveInfo.FileType)
                    {
                    case FileTypeEnum.FITS:
                        path = SaveFits(fileSaveInfo);
                        break;

                    case FileTypeEnum.XISF:
                        path = SaveXisf(fileSaveInfo);
                        break;

                    case FileTypeEnum.TIFF:
                    default:
                        path = SaveTiff(fileSaveInfo);
                        break;
                    }
                }

                return path;
            }, cancelToken));
        }
예제 #3
0
        public async Task PrepareFinalizeSavePatternMetaDataTest()
        {
            var data = new ushort[] {
                3, 1, 1,
                3, 4, 5,
                3, 2, 3
            };

            var pattern = $"$$FILTER$$" +
                          $"#$$DATE$$" +
                          $"#$$DATEMINUS12$$" +
                          $"#$$DATETIME$$" +
                          $"#$$TIME$$" +
                          $"#$$FRAMENR$$" +
                          $"#$$IMAGETYPE$$" +
                          $"#$$BINNING$$" +
                          $"#$$SENSORTEMP$$" +
                          $"#$$EXPOSURETIME$$" +
                          $"#$$TARGETNAME$$" +
                          $"#$$GAIN$$" +
                          $"#$$OFFSET$$" +
                          $"#$$RMS$$" +
                          $"#$$RMSARCSEC$$" +
                          $"#$$FOCUSERPOSITION$$" +
                          $"#$$APPLICATIONSTARTDATE$$";

            var fileSaveInfo = new FileSaveInfo {
                FilePath    = TestContext.CurrentContext.TestDirectory,
                FilePattern = pattern,
                FileType    = NINA.Utility.Enum.FileTypeEnum.XISF
            };

            var sut  = new ImageData(data, 3, 3, 16, false, MetaData);
            var file = await sut.PrepareSave(fileSaveInfo, default);

            file = sut.FinalizeSave(file, pattern);
            File.Delete(file);

            var expectedPattern = $"{MetaData.FilterWheel.Filter}" +
                                  $"#{MetaData.Image.ExposureStart.ToString("yyyy-MM-dd")}" +
                                  $"#{MetaData.Image.ExposureStart.AddHours(-12).ToString("yyyy-MM-dd")}" +
                                  $"#{MetaData.Image.ExposureStart.ToString("yyyy-MM-dd_HH-mm-ss")}" +
                                  $"#{MetaData.Image.ExposureStart.ToString("HH-mm-ss")}" +
                                  $"#{MetaData.Image.ExposureNumber.ToString("0000")}" +
                                  $"#{MetaData.Image.ImageType}" +
                                  $"#{MetaData.Camera.Binning}" +
                                  $"#{string.Format(CultureInfo.InvariantCulture, "{0:0.00}", MetaData.Camera.Temperature)}" +
                                  $"#{string.Format(CultureInfo.InvariantCulture, "{0:0.00}", MetaData.Image.ExposureTime)}" +
                                  $"#{MetaData.Target.Name}" +
                                  $"#{string.Format("{0:0}", MetaData.Camera.Gain)}" +
                                  $"#{string.Format("{0:0}", MetaData.Camera.Offset)}" +
                                  $"#{string.Format(CultureInfo.InvariantCulture, "{0:0.00}", MetaData.Image.RecordedRMS.Total)}" +
                                  $"#{string.Format(CultureInfo.InvariantCulture, "{0:0.00}", MetaData.Image.RecordedRMS.Total * MetaData.Image.RecordedRMS.Scale)}" +
                                  $"#{string.Format(CultureInfo.InvariantCulture, "{0:0.00}", MetaData.Focuser.Position)}" +
                                  $"#{Utility.ApplicationStartDate.ToString("yyyy-MM-dd")}";

            Path.GetFileName(file).Should().Be($"{expectedPattern}.{fileSaveInfo.FileType.ToString().ToLower()}");
        }
예제 #4
0
        protected async Task <string> PrepareAndSaveImage(IImageData source, CancellationToken cancelToken)
        {
            FileSaveInfo fileSaveInfo = new FileSaveInfo {
                FilePath    = WORKING_DIRECTORY,
                FilePattern = Path.GetRandomFileName(),
                FileType    = FileTypeEnum.FITS
            };

            return(await source.SaveToDisk(fileSaveInfo, cancelToken, forceFileType : true));
        }
예제 #5
0
        public XISFData(ushort[] data, FileSaveInfo fileSaveInfo)
        {
            CompressionType = fileSaveInfo.XISFCompressionType;
            ChecksumType    = fileSaveInfo.XISFChecksumType;;
            ByteShuffling   = fileSaveInfo.XISFByteShuffling;
            ShuffleItemSize = sizeof(ushort);

            Data           = PrepareArray(data);
            Size           = (uint)data.Length * sizeof(ushort);
            CompressedSize = CompressionType == XISFCompressionTypeEnum.NONE ? 0 : (uint)Data.Length;
        }
예제 #6
0
        /// <summary>
        ///     根据文件Key删除文件
        /// </summary>
        /// <param name="fileKey"></param>
        /// <param name="param"></param>
        /// <returns></returns>
        public void DeleteFile(string fileKey, params object[] param)
        {
            FileSaveInfo fileSaveInfo = _currentKey.GetFileSavePath(fileKey, param);

            var filehelper = new FileHelper
            {
                hostIp       = fileSaveInfo.FileServer.hostip,
                password     = fileSaveInfo.FileServer.password,
                username     = fileSaveInfo.FileServer.username,
                startdirname = fileSaveInfo.FileServer.startdirname
            };

            filehelper.DeleteFile(fileSaveInfo.Dirname, fileSaveInfo.Savefilename);
        }
예제 #7
0
        /// <summary>
        /// </summary>
        /// <param name="fileKey"></param>
        /// <param name="param"></param>
        /// <returns></returns>
        public string GetFileStorePath(string fileKey, params object[] param)
        {
            FileSaveInfo fileSaveInfo = _currentKey.GetFileSavePath(fileKey, param);

            var filehelper = new FileHelper
            {
                hostIp       = fileSaveInfo.FileServer.hostip,
                password     = fileSaveInfo.FileServer.password,
                username     = fileSaveInfo.FileServer.username,
                startdirname = fileSaveInfo.FileServer.startdirname
            };

            return(filehelper.GetFileName(fileSaveInfo.Dirname, fileSaveInfo.Savefilename));
        }
예제 #8
0
        /// <summary>
        /// </summary>
        /// <param name="bytefile"></param>
        /// <param name="fileKey"></param>
        /// <param name="param"></param>
        /// <returns></returns>
        public string UpdateFile(byte[] bytefile, string fileKey, params object[] param)
        {
            FileSaveInfo fileSaveInfo = _currentKey.GetFileSavePath(fileKey, param);

            var filehelper = new FileHelper
            {
                hostIp       = fileSaveInfo.FileServer.hostip,
                password     = fileSaveInfo.FileServer.password,
                username     = fileSaveInfo.FileServer.username,
                startdirname = fileSaveInfo.FileServer.startdirname
            };

            filehelper.UpdateFile(fileSaveInfo.Dirname, fileSaveInfo.Savefilename, bytefile);

            return(fileKey);
        }
예제 #9
0
        public string SaveFileBySpecifyName(byte[] bytefile, string fileKey, string specifyName)
        {
            FileSaveInfo fileSaveInfo = _currentKey.GetFileSavePath(fileKey);

            var filehelper = new FileHelper
            {
                hostIp       = fileSaveInfo.FileServer.hostip,
                password     = fileSaveInfo.FileServer.password,
                username     = fileSaveInfo.FileServer.username,
                startdirname = fileSaveInfo.FileServer.startdirname
            };

            filehelper.UpdateFile(fileSaveInfo.Dirname, specifyName, bytefile);

            return(fileKey);
        }
예제 #10
0
        private string GetFilePath(FileSaveInfo fileInfo, string newFilename = null)
        {
            var startdirname = fileInfo.FileServer.startdirname;

            var apppath = System.AppDomain.CurrentDomain.BaseDirectory.TrimEnd('\\', '/');;

            startdirname = startdirname.Replace("|APP_BASE|", apppath);



            //var filepath = "" + startdirname + "/" + fileInfo.Dirname + "/" + fileInfo.Savefilename;

            var filepath = Path.Combine(startdirname, fileInfo.Dirname, newFilename ?? fileInfo.Savefilename);


            return(filepath);
        }
예제 #11
0
        private string GetFilePath(FileSaveInfo fileInfo, string newFilename = null)
        {

            var startdirname = fileInfo.FileServer.startdirname;

            var apppath = System.AppDomain.CurrentDomain.BaseDirectory.TrimEnd('\\', '/'); ;

            startdirname = startdirname.Replace("|APP_BASE|", apppath);



            //var filepath = "" + startdirname + "/" + fileInfo.Dirname + "/" + fileInfo.Savefilename;

            var filepath = Path.Combine(startdirname, fileInfo.Dirname, newFilename ?? fileInfo.Savefilename);


            return filepath;
        }
예제 #12
0
        private string SaveFits(FileSaveInfo fileSaveInfo)
        {
            FITS f = new FITS(
                Data.FlatArray,
                Properties.Width,
                Properties.Height
                );

            f.PopulateHeaderCards(MetaData);

            Directory.CreateDirectory(Path.GetDirectoryName(fileSaveInfo.FilePath));
            string uniquePath = Utility.Utility.GetUniqueFilePath(fileSaveInfo.FilePath + ".fits");

            using (FileStream fs = new FileStream(uniquePath, FileMode.Create)) {
                f.Write(fs);
            }

            return(uniquePath);
        }
예제 #13
0
        /// <summary>
        ///  Saves file to application temp path
        /// </summary>
        /// <param name="fileType"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        public async Task <string> PrepareSave(FileSaveInfo fileSaveInfo, CancellationToken cancelToken = default)
        {
            var actualPath = string.Empty;

            try {
                using (MyStopWatch.Measure()) {
                    actualPath = await SaveToDiskAsync(fileSaveInfo, cancelToken, false);

                    Logger.Debug($"Saving temporary image at {actualPath}");
                }
            } catch (OperationCanceledException ex) {
                throw ex;
            } catch (Exception ex) {
                Logger.Error(ex);
                throw ex;
            } finally {
            }
            return(actualPath);
        }
예제 #14
0
        public async Task <string> SaveToDisk(FileSaveInfo fileSaveInfo, CancellationToken token, bool forceFileType = false)
        {
            string actualPath = string.Empty;

            try {
                using (MyStopWatch.Measure()) {
                    string tempPath = await SaveToDiskAsync(fileSaveInfo, token, forceFileType);

                    actualPath = FinalizeSave(tempPath, fileSaveInfo.FilePattern);
                }
            } catch (OperationCanceledException ex) {
                throw ex;
            } catch (Exception ex) {
                Logger.Error(ex);
                throw ex;
            } finally {
            }
            return(actualPath);
        }
예제 #15
0
        public async Task SaveToDiskPatternEmptyMetaDataTest()
        {
            var data = new ushort[] {
                3, 1, 1,
                3, 4, 5,
                3, 2, 3
            };

            var pattern = $"$$FILTER$$" +
                          $"#$$DATE$$" +
                          $"#$$DATEMINUS12$$" +
                          $"#$$DATETIME$$" +
                          $"#$$TIME$$" +
                          $"#$$FRAMENR$$" +
                          $"#$$IMAGETYPE$$" +
                          $"#$$BINNING$$" +
                          $"#$$SENSORTEMP$$" +
                          $"#$$EXPOSURETIME$$" +
                          $"#$$TARGETNAME$$" +
                          $"#$$GAIN$$" +
                          $"#$$OFFSET$$" +
                          $"#$$RMS$$" +
                          $"#$$RMSARCSEC$$" +
                          $"#$$FOCUSERPOSITION$$" +
                          $"#$$APPLICATIONSTARTDATE$$";

            var fileSaveInfo = new FileSaveInfo {
                FilePath            = TestContext.CurrentContext.TestDirectory,
                FilePattern         = pattern,
                FileType            = NINA.Utility.Enum.FileTypeEnum.TIFF,
                TIFFCompressionType = NINA.Utility.Enum.TIFFCompressionTypeEnum.LZW
            };

            var sut  = new ImageData(data, 3, 3, 16, false, new ImageMetaData());
            var file = await sut.SaveToDisk(fileSaveInfo, default);

            File.Delete(file);

            var expectedPattern = $"#0001-01-01##0001-01-01_00-00-00#00-00-00#-0001##1x1#########{Utility.ApplicationStartDate.ToString("yyyy-MM-dd")}.tif";

            Path.GetFileName(file).Should().Be($"{expectedPattern}");
        }
예제 #16
0
        private string SaveXisf(FileSaveInfo fileSaveInfo)
        {
            XISFHeader header = new XISFHeader();

            header.AddImageMetaData(Properties, MetaData.Image.ImageType);

            header.Populate(MetaData);

            XISF img = new XISF(header);

            img.AddAttachedImage(Data.FlatArray, fileSaveInfo);

            Directory.CreateDirectory(Path.GetDirectoryName(fileSaveInfo.FilePath));
            string uniquePath = Utility.Utility.GetUniqueFilePath(fileSaveInfo.FilePath + ".xisf");

            using (FileStream fs = new FileStream(uniquePath, FileMode.Create)) {
                img.Save(fs);
            }

            return(uniquePath);
        }
예제 #17
0
        public void AddAttachedImage(ushort[] data, FileSaveInfo fileSaveInfo)
        {
            if (Header.Image == null)
            {
                throw new InvalidOperationException("No Image Header Information available for attaching image. Add Image Header first!");
            }

            // Add Attached data location info to header
            Data = new XISFData(data, fileSaveInfo);

            if (Data.ChecksumType != XISFChecksumTypeEnum.NONE)
            {
                Header.Image.Add(new XAttribute("checksum", $"{Data.ChecksumName}:{Data.Checksum}"));
            }

            int headerLengthBytes      = 4;
            int reservedBytes          = 4;
            int attachmentInfoMaxBytes = 256; // Assume max 256 bytes for the attachment, compression, and checksum attributes.
            int currentHeaderSize      = Header.ByteCount + xisfSignature.Length + headerLengthBytes + reservedBytes + attachmentInfoMaxBytes;

            int dataBlockStart = currentHeaderSize + (PaddedBlockSize - currentHeaderSize % PaddedBlockSize);

            if (Data.CompressionType != XISFCompressionTypeEnum.NONE)
            {
                Header.Image.Add(new XAttribute("location", $"attachment:{dataBlockStart}:{Data.CompressedSize}"));

                if (Data.ByteShuffling == true)
                {
                    Header.Image.Add(new XAttribute("compression", $"{Data.CompressionName}:{Data.Size}:{Data.ShuffleItemSize}"));
                }
                else
                {
                    Header.Image.Add(new XAttribute("compression", $"{Data.CompressionName}:{Data.Size}"));
                }
            }
            else
            {
                Header.Image.Add(new XAttribute("location", $"attachment:{dataBlockStart}:{Data.Size}"));
            }
        }
예제 #18
0
        private async Task <JObject> SubmitImage(string session, IImageData source, CancellationToken cancelToken)
        {
            string filePath = null;

            try {
                FileSaveInfo fileSaveInfo = new FileSaveInfo {
                    FilePath    = WORKING_DIRECTORY,
                    FilePattern = Path.GetRandomFileName(),
                    FileType    = FileTypeEnum.FITS
                };

                filePath = await source.SaveToDisk(fileSaveInfo, cancelToken, forceFileType : true);

                using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)) {
                    return(await SubmitImageStream(fs, session, cancelToken));
                }
            } finally {
                if (filePath != null && File.Exists(filePath))
                {
                    File.Delete(filePath);
                }
            }
        }
예제 #19
0
        public async Task SaveToDiskXISFSimpleTest(NINA.Utility.Enum.FileTypeEnum fileType, string extension)
        {
            var data = new ushort[] {
                3, 1, 1,
                3, 4, 5,
                3, 2, 3
            };

            var fileSaveInfo = new FileSaveInfo {
                FilePath    = TestContext.CurrentContext.TestDirectory,
                FilePattern = "TestFile",
                FileType    = fileType
            };

            //var sut = await new ImageArrayExposureData(data, 3, 3, 16, false, new ImageMetaData()).ToImageData();
            var sut = new ImageData(data, 3, 3, 16, false, MetaData);

            var file = await sut.SaveToDisk(fileSaveInfo, default);

            File.Exists(file).Should().BeTrue();
            File.Delete(file);
            Path.GetFileName(file).Should().Be($"{fileSaveInfo.FilePattern}{extension}");
        }
예제 #20
0
 private string GetFilePath(FileSaveInfo fileInfo)
 {
     return "" + fileInfo.FileServer.startdirname + "/" + fileInfo.dirname + "/" + fileInfo.savefilename;
 }