diff options
author | Tiago Conceição <Tiago_caza@hotmail.com> | 2022-07-19 01:04:08 +0300 |
---|---|---|
committer | Tiago Conceição <Tiago_caza@hotmail.com> | 2022-07-19 01:04:08 +0300 |
commit | 315ce3bc0dfc7a950138473f66ac83e0fa119f6c (patch) | |
tree | e4087a6e41057ee7c7f527aa2c85757764df24f6 /UVtools.Core | |
parent | 521fb58dcdbff64e3a5b9f9e552730123113cfac (diff) |
v3.5.5v3.5.5
- **File formats:**
- (Add) `LayerImageType`: Gets the layer image data type used on this file format
- (Improvement) jxs, rgb.cws and xml.cws: Improve the layer image read/write performance by a significant amount
- (Fix) xml.cws: Wanhao printers need 32 bit png instead of 8 bit png (#514)
Diffstat (limited to 'UVtools.Core')
-rw-r--r-- | UVtools.Core/FileFormats/CWSFile.cs | 78 | ||||
-rw-r--r-- | UVtools.Core/FileFormats/FileFormat.cs | 98 | ||||
-rw-r--r-- | UVtools.Core/FileFormats/JXSFile.cs | 43 | ||||
-rw-r--r-- | UVtools.Core/UVtools.Core.csproj | 2 |
4 files changed, 112 insertions, 109 deletions
diff --git a/UVtools.Core/FileFormats/CWSFile.cs b/UVtools.Core/FileFormats/CWSFile.cs index b32d673..808a8a3 100644 --- a/UVtools.Core/FileFormats/CWSFile.cs +++ b/UVtools.Core/FileFormats/CWSFile.cs @@ -293,6 +293,14 @@ public class CWSFile : FileFormat public override FileFormatType FileType => FileFormatType.Archive; + public override FileImageType LayerImageType => + Printer switch + { + PrinterType.BeneMono => FileImageType.Png24BgrAA, + PrinterType.Wanhao => FileImageType.Png32, + _ => FileImageType.Png8 + }; + public enum PrinterType : byte { Unknown, @@ -658,49 +666,7 @@ public class CWSFile : FileFormat } } - if (Printer == PrinterType.BeneMono) - { - EncodeLayersInZip(outputFile, filename, LayerDigits, IndexStartNumber.Zero, progress, matGenFunc: - (_, mat) => - { - var bgrMat = new Mat(mat.Height, mat.GetRealStep() / 3, DepthType.Cv8U, 3); - var bgrMatSpan = bgrMat.GetDataByteSpan(); - var greySpan = mat.GetDataByteSpan(); - for (int i = 0; i < greySpan.Length; i++) - { - bgrMatSpan[i] = greySpan[i]; - } - - return bgrMat; - }); - /*Parallel.For(0, LayerCount, CoreSettings.GetParallelOptions(progress), - //new ParallelOptions { MaxDegreeOfParallelism = Printer == PrinterType.BeneMono ? 1 : 1 }, - layerIndex => - { - var layer = this[layerIndex]; - var layerImagePath = layer.FormatFileNameWithLayerDigits(filename); - - using var mat = layer.LayerMat; - using var matEncode = new Mat(mat.Height, mat.GetRealStep() / 3, DepthType.Cv8U, 3); - var span = mat.GetDataByteSpan(); - var spanEncode = matEncode.GetDataByteSpan(); - for (int i = 0; i < span.Length; i++) - { - spanEncode[i] = span[i]; - } - - var bytes = matEncode.GetPngByes(); - lock (progress.Mutex) - { - outputFile.PutFileContent(layerImagePath, bytes, ZipArchiveMode.Create); - progress++; - } - });*/ - } - else - { - EncodeLayersInZip(outputFile, filename, LayerDigits, IndexStartNumber.Zero, progress); - } + EncodeLayersInZip(outputFile, filename, LayerDigits, IndexStartNumber.Zero, progress); RebuildGCode(); outputFile.PutFileContent($"{filename}.gcode", GCodeStr, ZipArchiveMode.Create); @@ -861,31 +827,9 @@ public class CWSFile : FileFormat } } - if (Printer == PrinterType.BeneMono) - { - DecodeLayersFromZipRegex(inputFile, @"(\d+).png", IndexStartNumber.Zero, progress, - (layerIndex, pngBytes) => - { - using Mat bgrMat = new(); - CvInvoke.Imdecode(pngBytes, ImreadModes.AnyColor, bgrMat); - var greyMat = new Mat(bgrMat.Height, bgrMat.GetRealStep(), DepthType.Cv8U, 1); - var bgrSpan = bgrMat.GetDataByteSpan(); - var greySpan = greyMat.GetDataByteSpan(); - for (int i = 0; i < bgrSpan.Length; i++) - { - greySpan[i] = bgrSpan[i]; - } - - return greyMat; - }); - } - else - { - DecodeLayersFromZipRegex(inputFile, @"(\d+).png", IndexStartNumber.Zero, progress); - } - - GCode.ParseLayersFromGCode(this); + DecodeLayersFromZipRegex(inputFile, @"(\d+).png", IndexStartNumber.Zero, progress); + GCode.ParseLayersFromGCode(this); } public override void RebuildGCode() diff --git a/UVtools.Core/FileFormats/FileFormat.cs b/UVtools.Core/FileFormats/FileFormat.cs index e62310d..27dce29 100644 --- a/UVtools.Core/FileFormats/FileFormat.cs +++ b/UVtools.Core/FileFormats/FileFormat.cs @@ -163,6 +163,26 @@ public abstract class FileFormat : BindableBase, IDisposable, IEquatable<FileFor Partial, } + /// <summary> + /// Image data type + /// </summary> + public enum FileImageType : byte + { + Custom, + Png8, + Png24, + Png32, + /// <summary> + /// eg: Nova Bene4 + /// </summary> + Png24BgrAA, + /// <summary> + /// eg: Uniformation GKone + /// </summary> + Png24RgbAA, + + } + #endregion #region Sub Classes @@ -1023,6 +1043,11 @@ public abstract class FileFormat : BindableBase, IDisposable, IEquatable<FileFor public abstract FileFormatType FileType { get; } /// <summary> + /// Gets the layer image data type used on this file format + /// </summary> + public virtual FileImageType LayerImageType => FileType == FileFormatType.Archive ? FileImageType.Png8 : FileImageType.Custom; + + /// <summary> /// Gets the valid file extensions for this <see cref="FileFormat"/> /// </summary> public abstract FileExtension[] FileExtensions { get; } @@ -3416,13 +3441,54 @@ public abstract class FileFormat : BindableBase, IDisposable, IEquatable<FileFor progress.Reset(OperationProgress.StatusEncodeLayers, LayerCount); var batches = BatchLayersIndexes(); var pngLayerBytes = new byte[LayerCount][]; + + var layerImageType = LayerImageType; + foreach (var batch in batches) { Parallel.ForEach(batch, CoreSettings.GetParallelOptions(progress), layerIndex => { if (matGenFunc is null) { - pngLayerBytes[layerIndex] = this[layerIndex].CompressedPngBytes!; + switch (layerImageType) + { + case FileImageType.Png24: + { + using var mat = this[layerIndex].LayerMat; + CvInvoke.CvtColor(mat, mat, ColorConversion.Gray2Bgr); + pngLayerBytes[layerIndex] = mat.GetPngByes(); + + break; + } + case FileImageType.Png32: + { + using var mat = this[layerIndex].LayerMat; + CvInvoke.CvtColor(mat, mat, ColorConversion.Gray2Bgra); + pngLayerBytes[layerIndex] = mat.GetPngByes(); + + break; + } + case FileImageType.Png24BgrAA: + { + using var mat = this[layerIndex].LayerMat; + using var outputMat = mat.Reshape(3); + pngLayerBytes[layerIndex] = outputMat.GetPngByes(); + + break; + } + case FileImageType.Png24RgbAA: + { + using var mat = this[layerIndex].LayerMat; + using var outputMat = mat.Reshape(3); + CvInvoke.CvtColor(outputMat, outputMat, ColorConversion.Bgr2Rgb); + pngLayerBytes[layerIndex] = outputMat.GetPngByes(); + + break; + } + default: + pngLayerBytes[layerIndex] = this[layerIndex].CompressedPngBytes!; + break; + } } else { @@ -3461,6 +3527,8 @@ public abstract class FileFormat : BindableBase, IDisposable, IEquatable<FileFor progress ??= new OperationProgress(); progress.Reset(OperationProgress.StatusDecodeLayers, LayerCount); + var layerImageType = LayerImageType; + Parallel.For(0, LayerCount, CoreSettings.GetParallelOptions(progress), layerIndex => { byte[] pngBytes; @@ -3472,7 +3540,33 @@ public abstract class FileFormat : BindableBase, IDisposable, IEquatable<FileFor if (matGenFunc is null) { - _layers[layerIndex] = new Layer((uint)layerIndex, pngBytes, this); + switch (layerImageType) + { + case FileImageType.Png24BgrAA: + { + using var bgrMat = new Mat(); + CvInvoke.Imdecode(pngBytes, ImreadModes.Color, bgrMat); + using var greyMat = bgrMat.Reshape(1); + + _layers[layerIndex] = new Layer((uint) layerIndex, greyMat, this); + + break; + } + case FileImageType.Png24RgbAA: + { + using Mat rgbMat = new(); + CvInvoke.Imdecode(pngBytes, ImreadModes.Color, rgbMat); + CvInvoke.CvtColor(rgbMat, rgbMat, ColorConversion.Bgr2Rgb); + using var greyMat = rgbMat.Reshape(1); + + _layers[layerIndex] = new Layer((uint)layerIndex, greyMat, this); + + break; + } + default: + _layers[layerIndex] = new Layer((uint)layerIndex, pngBytes, this); + break; + } } else { diff --git a/UVtools.Core/FileFormats/JXSFile.cs b/UVtools.Core/FileFormats/JXSFile.cs index 098042a..27631c1 100644 --- a/UVtools.Core/FileFormats/JXSFile.cs +++ b/UVtools.Core/FileFormats/JXSFile.cs @@ -85,6 +85,8 @@ public class JXSFile : FileFormat public override FileFormatType FileType => FileFormatType.Archive; + public override FileImageType LayerImageType => FileImageType.Png24RgbAA; + public override FileExtension[] FileExtensions { get; } = { new(typeof(JXSFile), "jxs", "Uniformation GKone (JXS)") }; @@ -510,27 +512,8 @@ public class JXSFile : FileFormat } Init(ConfigFile.LayerCount, DecodeType == FileDecodeType.Partial); - sbyte[] bgrToRgbTable = { - 2, - 0, - -2 - }; - DecodeLayersFromZip(inputFile, IndexStartNumber.Zero, progress, - (layerIndex, pngBytes) => - { - using Mat rgbMat = new(); - CvInvoke.Imdecode(pngBytes, ImreadModes.AnyColor, rgbMat); - var greyMat = new Mat(rgbMat.Height, rgbMat.GetRealStep(), DepthType.Cv8U, 1); - var rgbSpan = rgbMat.GetDataByteSpan(); - var greySpan = greyMat.GetDataByteSpan(); - for (var i = 0; i < rgbSpan.Length; i++) - { - greySpan[i] = rgbSpan[i + bgrToRgbTable[i%3]]; - } - - return greyMat; - }); + DecodeLayersFromZip(inputFile, IndexStartNumber.Zero, progress); GCode!.Clear(); @@ -587,25 +570,7 @@ public class JXSFile : FileFormat { using var outputFile = ZipFile.Open(TemporaryOutputFileFullPath, ZipArchiveMode.Create); - sbyte[] bgrToRgbTable = { - 2, - 0, - -2 - }; - EncodeLayersInZip(outputFile, 5, IndexStartNumber.Zero, progress, matGenFunc: - (_, mat) => - { - var rgbMat = new Mat(mat.Height, mat.GetRealStep() / 3, DepthType.Cv8U, 3); - var rgbMatSpan = rgbMat.GetDataByteSpan(); - var greySpan = mat.GetDataByteSpan(); - for (int i = 0; i < greySpan.Length; i++) - { - rgbMatSpan[i + bgrToRgbTable[i % 3]] = greySpan[i]; - } - - return rgbMat; - }); - + EncodeLayersInZip(outputFile, 5, IndexStartNumber.Zero, progress); RebuildFileProperties(); diff --git a/UVtools.Core/UVtools.Core.csproj b/UVtools.Core/UVtools.Core.csproj index 11a0667..7cfb01f 100644 --- a/UVtools.Core/UVtools.Core.csproj +++ b/UVtools.Core/UVtools.Core.csproj @@ -10,7 +10,7 @@ <RepositoryUrl>https://github.com/sn4k3/UVtools</RepositoryUrl> <PackageProjectUrl>https://github.com/sn4k3/UVtools</PackageProjectUrl> <Description>MSLA/DLP, file analysis, calibration, repair, conversion and manipulation</Description> - <Version>3.5.4</Version> + <Version>3.5.5</Version> <Copyright>Copyright © 2020 PTRTECH</Copyright> <PackageIcon>UVtools.png</PackageIcon> <Platforms>AnyCPU;x64</Platforms> |