Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/sn4k3/UVtools.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'UVtools.Cmd/Symbols/SetThumbnailCommand.cs')
-rw-r--r--UVtools.Cmd/Symbols/SetThumbnailCommand.cs148
1 files changed, 148 insertions, 0 deletions
diff --git a/UVtools.Cmd/Symbols/SetThumbnailCommand.cs b/UVtools.Cmd/Symbols/SetThumbnailCommand.cs
new file mode 100644
index 0000000..9143ada
--- /dev/null
+++ b/UVtools.Cmd/Symbols/SetThumbnailCommand.cs
@@ -0,0 +1,148 @@
+/*
+ * GNU AFFERO GENERAL PUBLIC LICENSE
+ * Version 3, 19 November 2007
+ * Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ * Everyone is permitted to copy and distribute verbatim copies
+ * of this license document, but changing it is not allowed.
+ */
+
+using Emgu.CV;
+using System;
+using System.Collections.Generic;
+using System.CommandLine;
+using System.IO;
+using System.Linq;
+using Emgu.CV.CvEnum;
+
+namespace UVtools.Cmd.Symbols;
+
+internal static class SetThumbnailCommand
+{
+ private const string HeatmapArg = ":heatmap";
+ private const string RandomLayerArg = ":random-layer";
+ internal static Command CreateCommand()
+ {
+ var sourceArgument = new Argument<string>($"file path|layer index|{RandomLayerArg}|{HeatmapArg}", () => HeatmapArg, "Choose from a file, layer index, random layer or generate a heatmap");
+ var thumbnailIndexesOption = new Option<IEnumerable<byte>>("-i", "Select the thumbnail index(es) to set");
+
+ var command = new Command("set-thumbnail", "Sets and replace thumbnail(s) in the file")
+ {
+ GlobalArguments.InputFileArgument,
+ sourceArgument,
+ thumbnailIndexesOption,
+ };
+
+ command.AddAlias("set-preview");
+
+ command.SetHandler(async (inputFile, source, thumbnailIndexes) =>
+ {
+ if (string.IsNullOrWhiteSpace(source))
+ {
+ Program.WriteLineError("Invalid empty source argument.");
+ }
+
+ bool result = false;
+
+ if (string.Equals(source, HeatmapArg, StringComparison.OrdinalIgnoreCase))
+ {
+ var slicerFile = Program.OpenInputFile(inputFile);
+ using var mat = await Program.ProgressBarWork($"Generating a heatmap from layers 0 through {slicerFile.LastLayerIndex}",
+ () => slicerFile.GenerateHeatmapAsync(slicerFile.GetBoundingRectangle(50, 100, Program.Progress), Program.Progress));
+
+ CvInvoke.CvtColor(mat, mat, ColorConversion.Gray2Bgr);
+
+
+ if (thumbnailIndexes.Any())
+ {
+ foreach (var thumbnailIndex in thumbnailIndexes)
+ {
+ result = slicerFile.SetThumbnail(thumbnailIndex, mat);
+ }
+ }
+ else
+ {
+ result = slicerFile.SetThumbnails(mat) > 0;
+ }
+
+ if(result) Program.SaveFile(slicerFile);
+ return;
+ }
+
+ if (string.Equals(source, RandomLayerArg, StringComparison.OrdinalIgnoreCase))
+ {
+ var slicerFile = Program.OpenInputFile(inputFile);
+ if(slicerFile.LayerCount == 0) Program.WriteLineError("The file have no valid layers");
+
+
+ using var matRoi = slicerFile[Random.Shared.Next((int) slicerFile.LayerCount)].GetLayerMatBoundingRectangle(50, 100);
+ CvInvoke.CvtColor(matRoi.RoiMat, matRoi.RoiMat, ColorConversion.Gray2Bgr);
+
+ if (thumbnailIndexes.Any())
+ {
+ foreach (var thumbnailIndex in thumbnailIndexes)
+ {
+ result = slicerFile.SetThumbnail(thumbnailIndex, matRoi.RoiMat);
+ }
+ }
+ else
+ {
+ result = slicerFile.SetThumbnails(matRoi.RoiMat) > 0;
+ }
+
+ if (result) Program.SaveFile(slicerFile);
+ return;
+ }
+
+ if (uint.TryParse(source, out var layerIndex))
+ {
+ var slicerFile = Program.OpenInputFile(inputFile);
+ if (slicerFile.LayerCount == 0) Program.WriteLineError("The file have no valid layers");
+ slicerFile.SanitizeLayerIndex(ref layerIndex);
+
+ using var matRoi = slicerFile[layerIndex].GetLayerMatBoundingRectangle(50, 100);
+ CvInvoke.CvtColor(matRoi.RoiMat, matRoi.RoiMat, ColorConversion.Gray2Bgr);
+
+ if (thumbnailIndexes.Any())
+ {
+ foreach (var thumbnailIndex in thumbnailIndexes)
+ {
+ result = slicerFile.SetThumbnail(thumbnailIndex, matRoi.RoiMat);
+ }
+ }
+ else
+ {
+ result = slicerFile.SetThumbnails(matRoi.RoiMat) > 0;
+ }
+
+ if (result) Program.SaveFile(slicerFile);
+ return;
+ }
+
+ if (File.Exists(source))
+ {
+ var slicerFile = Program.OpenInputFile(inputFile);
+
+ if (thumbnailIndexes.Any())
+ {
+ foreach (var thumbnailIndex in thumbnailIndexes)
+ {
+ result = slicerFile.SetThumbnail(thumbnailIndex, source);
+ }
+ }
+ else
+ {
+ result = slicerFile.SetThumbnails(source) > 0;
+ }
+
+ if (result) Program.SaveFile(slicerFile);
+ return;
+ }
+
+ Program.WriteLineError($"'{source}' is not a file nor layer index nor {RandomLayerArg} nor {HeatmapArg}");
+
+
+ }, GlobalArguments.InputFileArgument, sourceArgument, thumbnailIndexesOption);
+
+ return command;
+ }
+} \ No newline at end of file