public static void HandleFile(string filename, GRBImageHeader header) { string dir = Path.GetDirectoryName(filename); string ofilename = header.filename ?? Path.GetFileName(filename); // Separate DQF string dqfFilename = $"{filename}.dqf"; try { byte[] buffer = File.ReadAllBytes(filename); buffer = buffer.Skip((int)header.dqfOffset).ToArray(); File.WriteAllBytes(dqfFilename, buffer); } catch (Exception) { } string productFolder = Products.GetFolderByAPID(header.apid); string bPath = productFolder; string zPath = Path.Combine(bPath, $"{header.epoch:D16}", $"{header.sequence:D8}"); string f = Path.Combine(FileHandler.FinalFileFolder, zPath); try { Directory.CreateDirectory(Path.Combine(FileHandler.FinalFileFolder, bPath, $"{header.epoch:D16}")); } catch (IOException e) { UIConsole.Error($"Cannot create directory {bPath}: {e}"); } if (!ImageCache.ContainsKey(zPath)) { ImageCache.Add(zPath, new ImageAssembler((int)header.width, (int)header.height)); DQFCache.Add(zPath, new ImageAssembler((int)header.width, (int)header.height)); } ImageCache[zPath].AppendJ2K(filename); DQFCache[zPath].AppendJ2K(dqfFilename); try { File.Delete(filename); File.Delete(dqfFilename); } catch (IOException e) { UIConsole.Error($"Error erasing file {filename}: {e}"); } if (ImageCache[zPath].Done) { // UIConsole.Log ($"New image at {f}"); // ImageCache [zPath].SavePGM ($"{f}.pgm"); // ImageCache [zPath].SaveJPG ($"{f}.jpg"); // File.WriteAllText($"{f}.txt", header.ToString()); ProcessBigImage(bPath, ImageCache[zPath], header); ImageCache.Remove(zPath); // FIXME: Discarding DQF // DQFCache[zPath].SavePGM($"{f}.dqf.pgm"); DQFCache.Remove(zPath); } }
/// <summary> /// Processes a new image part /// </summary> /// <param name="filename">Filename.</param> /// <param name="header">Header.</param> public void NewImage(string filename, GRBImageHeader header) { lock (syncLock) { if (ImageCache == null) { if (SaveDQF) { DQF = new ImageAssembler((int)header.width, (int)header.height, Epoch); } ImageCache = new ImageAssembler((int)header.width, (int)header.height, Epoch); } if (SaveDQF) { // Separate DQF string dqfFilename = $"{filename}.dqf"; try { byte[] buffer = File.ReadAllBytes(filename); buffer = buffer.Skip((int)header.dqfOffset).ToArray(); File.WriteAllBytes(dqfFilename, buffer); } catch (Exception e) { UIConsole.Error($"Error slicing DQF file to {filename}.dqf: {e.Message}"); UIConsole.Debug($"{e}"); } DQF.AppendJ2K(dqfFilename); try { File.Delete(dqfFilename); } catch (IOException e) { UIConsole.Error($"Error erasing file {filename}: {e.Message}"); UIConsole.Debug($"{e}"); } } ImageCache.AppendJ2K(filename); try { File.Delete(filename); } catch (IOException e) { UIConsole.Error($"Error erasing file {filename}: {e.Message}"); UIConsole.Debug($"{e}"); } if (ImageCache.Done) { ProcessBigImage(header); } } }
void ProcessBigImage(GRBImageHeader header) { if (FullImageCache == null) { var product = Products.GetProductByAPID(APID); var imsz = (ImageSize)product.Meta[1]; FullImageCache = new ImageAssembler(imsz.Width, imsz.Height, Epoch); if (SaveDQF) { FullDQFCache = new ImageAssembler(imsz.Width, imsz.Height, Epoch); } } FullImageCache.DrawAt(ImageCache.Image, (int)header.ulX, (int)header.ulY + (int)header.rowOffset, true); // rowOffset to int might be bad if (SaveDQF) { FullDQFCache.DrawAt(DQF.Image, (int)header.ulX, (int)header.ulY + (int)header.rowOffset, true); // rowOffset to int might be bad } DQF = null; ImageCache = null; }
static void ProcessBigImage(string bPath, ImageAssembler segment, GRBImageHeader header) { int apid = header.apid; ulong currentEpoch = header.epoch; string imKey = $"{apid:X3}-{currentEpoch}"; var product = Products.GetProductByAPID(apid); var imsz = (ImageSize)product.Meta[1]; if (APIDStamp.ContainsKey(apid) && APIDStamp[apid] != currentEpoch) { ulong oldEpoch = APIDStamp[apid]; string oldImKey = $"{apid:X3}-{oldEpoch}"; string outfolder = Path.Combine(FileHandler.FinalFileFolder, bPath, oldEpoch.ToString()); Task.Run(async() => { var imas = BigImageCache[oldImKey]; // UIConsole.Log($"Saving{outfolder}.pgm"); await imas.AsyncSavePGM($"{outfolder}.pgm"); // UIConsole.Log($"Saving{outfolder}.png"); await imas.AsyncSavePNG($"{outfolder}.png"); BigImageCache[oldImKey] = null; UIConsole.Log($"New {product.Name} at {outfolder}.pgm"); }); BigImageCache[imKey] = new ImageAssembler(imsz.Width, imsz.Height, currentEpoch); APIDStamp[apid] = currentEpoch; // UIConsole.Debug($"Starting for {imKey} with expected size ({imsz.Width}, {imsz.Height})"); } else if (!BigImageCache.ContainsKey(imKey)) { BigImageCache[imKey] = new ImageAssembler(imsz.Width, imsz.Height, currentEpoch); APIDStamp[apid] = currentEpoch; // UIConsole.Debug($"Starting for {imKey} with expected size ({imsz.Width}, {imsz.Height})"); } // UIConsole.Debug ($"{header.apid:X3} - Drawing {header.sequence} at {header.ulX}, {header.ulY}"); BigImageCache[imKey].DrawAt(segment.Image, (int)header.ulX, (int)header.ulY + (int)header.rowOffset, true); // rowOffset to int might be bad }
void HandleImage(string filename, GRBImageHeader header) { GRBFileHandler.HandleFile(filename, header); }