merge push
This commit is contained in:
@@ -6,9 +6,17 @@
|
|||||||
<RootNamespace>ComicCompressor</RootNamespace>
|
<RootNamespace>ComicCompressor</RootNamespace>
|
||||||
<OutputName>ComicCompress</OutputName>
|
<OutputName>ComicCompress</OutputName>
|
||||||
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
|
||||||
|
<Configurations>Debug;Release;ReleaseWDbg</Configurations>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Compile Remove="itext_pdfimage\**" />
|
||||||
|
<EmbeddedResource Remove="itext_pdfimage\**" />
|
||||||
|
<None Remove="itext_pdfimage\**" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Remove="Compressor.cs" />
|
||||||
<Compile Remove="FileParser.cs" />
|
<Compile Remove="FileParser.cs" />
|
||||||
<Compile Remove="ImageExtractor.cs" />
|
<Compile Remove="ImageExtractor.cs" />
|
||||||
<Compile Remove="ImageExtractor7.cs" />
|
<Compile Remove="ImageExtractor7.cs" />
|
||||||
@@ -16,6 +24,7 @@
|
|||||||
<Compile Remove="PixelMap.cs" />
|
<Compile Remove="PixelMap.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="BinaryKits.Zpl.Viewer" Version="1.2.1" />
|
<PackageReference Include="BinaryKits.Zpl.Viewer" Version="1.2.1" />
|
||||||
<PackageReference Include="GroupDocs.Parser" Version="23.8.0" />
|
<PackageReference Include="GroupDocs.Parser" Version="23.8.0" />
|
||||||
|
|||||||
@@ -4,10 +4,12 @@
|
|||||||
<DebuggerFlavor>ProjectDebugger</DebuggerFlavor>
|
<DebuggerFlavor>ProjectDebugger</DebuggerFlavor>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<ActiveDebugProfile>DEV_HOME</ActiveDebugProfile>
|
<ActiveDebugProfile>ComicCompress CBx</ActiveDebugProfile>
|
||||||
<_LastSelectedProfileId>E:\_COMIX\_TOOLS_\comic-compress-new\Properties\PublishProfiles\FolderProfile.pubxml</_LastSelectedProfileId>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||||
<DebuggerFlavor>ProjectDebugger</DebuggerFlavor>
|
<DebuggerFlavor>ProjectDebugger</DebuggerFlavor>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWDbg|AnyCPU'">
|
||||||
|
<DebuggerFlavor>ProjectDebugger</DebuggerFlavor>
|
||||||
|
</PropertyGroup>
|
||||||
</Project>
|
</Project>
|
||||||
@@ -13,20 +13,27 @@ Global
|
|||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
Release|Any CPU = Release|Any CPU
|
Release|Any CPU = Release|Any CPU
|
||||||
|
ReleaseWDbg|Any CPU = ReleaseWDbg|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
{2625C71D-E4EC-4768-BF04-87AAB364916A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{2625C71D-E4EC-4768-BF04-87AAB364916A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{2625C71D-E4EC-4768-BF04-87AAB364916A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{2625C71D-E4EC-4768-BF04-87AAB364916A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{2625C71D-E4EC-4768-BF04-87AAB364916A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{2625C71D-E4EC-4768-BF04-87AAB364916A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{2625C71D-E4EC-4768-BF04-87AAB364916A}.Release|Any CPU.Build.0 = Release|Any CPU
|
{2625C71D-E4EC-4768-BF04-87AAB364916A}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{2625C71D-E4EC-4768-BF04-87AAB364916A}.ReleaseWDbg|Any CPU.ActiveCfg = ReleaseWDbg|Any CPU
|
||||||
|
{2625C71D-E4EC-4768-BF04-87AAB364916A}.ReleaseWDbg|Any CPU.Build.0 = ReleaseWDbg|Any CPU
|
||||||
{7330E00C-6C24-44B3-9768-1604802532FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{7330E00C-6C24-44B3-9768-1604802532FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{7330E00C-6C24-44B3-9768-1604802532FB}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{7330E00C-6C24-44B3-9768-1604802532FB}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{7330E00C-6C24-44B3-9768-1604802532FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{7330E00C-6C24-44B3-9768-1604802532FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{7330E00C-6C24-44B3-9768-1604802532FB}.Release|Any CPU.Build.0 = Release|Any CPU
|
{7330E00C-6C24-44B3-9768-1604802532FB}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{7330E00C-6C24-44B3-9768-1604802532FB}.ReleaseWDbg|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{7330E00C-6C24-44B3-9768-1604802532FB}.ReleaseWDbg|Any CPU.Build.0 = Release|Any CPU
|
||||||
{990E9DC1-B842-4E0E-AD7F-00CB2EF24AF4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{990E9DC1-B842-4E0E-AD7F-00CB2EF24AF4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{990E9DC1-B842-4E0E-AD7F-00CB2EF24AF4}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{990E9DC1-B842-4E0E-AD7F-00CB2EF24AF4}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{990E9DC1-B842-4E0E-AD7F-00CB2EF24AF4}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{990E9DC1-B842-4E0E-AD7F-00CB2EF24AF4}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{990E9DC1-B842-4E0E-AD7F-00CB2EF24AF4}.Release|Any CPU.Build.0 = Release|Any CPU
|
{990E9DC1-B842-4E0E-AD7F-00CB2EF24AF4}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{990E9DC1-B842-4E0E-AD7F-00CB2EF24AF4}.ReleaseWDbg|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{990E9DC1-B842-4E0E-AD7F-00CB2EF24AF4}.ReleaseWDbg|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|||||||
-475
@@ -1,475 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Drawing;
|
|
||||||
using Imazen.WebP;
|
|
||||||
using SharpCompress.Archives;
|
|
||||||
using SharpCompress.Archives.Rar;
|
|
||||||
using SharpCompress.Archives.Zip;
|
|
||||||
using System.IO;
|
|
||||||
using SharpCompress.Common;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using javax.swing.plaf;
|
|
||||||
using SharpCompress.Readers;
|
|
||||||
using SharpCompress.Writers;
|
|
||||||
using SharpCompress.Compressors.Xz;
|
|
||||||
using iMGcompress_core;
|
|
||||||
//using SixLabors.ImageSharp;
|
|
||||||
//using SixLabors.ImageSharp;
|
|
||||||
//using SixLabors.ImageSharp.Processing;
|
|
||||||
|
|
||||||
namespace ComicCompressor
|
|
||||||
{
|
|
||||||
public class Compressor
|
|
||||||
{
|
|
||||||
private long last_mem = 0;
|
|
||||||
private Logger Logger { get; set; }
|
|
||||||
|
|
||||||
public int Quality { get; set; } = 75;
|
|
||||||
|
|
||||||
public Compressor(Logger logger)
|
|
||||||
{
|
|
||||||
Logger = logger;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Compress(string filename, string outputFile = null)
|
|
||||||
{
|
|
||||||
Stopwatch sw = Stopwatch.StartNew();
|
|
||||||
outputFile = Path.ChangeExtension(outputFile ?? filename, "cbz");
|
|
||||||
|
|
||||||
Process proc = Process.GetCurrentProcess();
|
|
||||||
//Logger.LogDebug($"M {proc.PrivateMemorySize64}", LogLevel.Verbose, col: Color.Green);
|
|
||||||
last_mem = proc.PrivateMemorySize64;
|
|
||||||
|
|
||||||
//Logger.Log("Processing: " + filename, LogLevel.Verbose);
|
|
||||||
|
|
||||||
IArchive archive = null;
|
|
||||||
//SharpCompress.Readers.ReaderOptions opt = new ReaderOptions()
|
|
||||||
//{
|
|
||||||
|
|
||||||
//}
|
|
||||||
|
|
||||||
ArchiveType ArchiveType = ArchiveType.Zip;
|
|
||||||
using (Stream stream = File.OpenRead(filename))
|
|
||||||
{
|
|
||||||
using (var reader = ReaderFactory.Open(stream))
|
|
||||||
ArchiveType = reader.ArchiveType;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isSolid = false;
|
|
||||||
//if (filename.EndsWith(".cbr"))
|
|
||||||
if (ArchiveType == ArchiveType.Rar)
|
|
||||||
{
|
|
||||||
archive = RarArchive.Open(filename);
|
|
||||||
//foreach (var entry in archive.Entries)
|
|
||||||
//{
|
|
||||||
// isSolid = isSolid || entry.IsSolid;
|
|
||||||
//}
|
|
||||||
isSolid = archive.IsSolid;
|
|
||||||
}
|
|
||||||
//else if (filename.EndsWith(".cbz"))
|
|
||||||
else if (ArchiveType == ArchiveType.Zip)
|
|
||||||
{
|
|
||||||
archive = ZipArchive.Open(filename);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Logger.Log($"Processing[{archive.Entries.Count()}]: " + filename, LogLevel.Verbose);
|
|
||||||
Logger.Log($"Processing[{archive.Entries.Count()}]: ", LogLevel.Verbose, false);
|
|
||||||
Logger.Log(filename, LogLevel.Verbose, col: Color.Green);
|
|
||||||
|
|
||||||
double save = 0;
|
|
||||||
int num_pages = 0;
|
|
||||||
if (isSolid)
|
|
||||||
{
|
|
||||||
using (Stream stream = File.OpenRead(filename))
|
|
||||||
{
|
|
||||||
using (var reader = ReaderFactory.Open(stream))
|
|
||||||
{
|
|
||||||
(save, num_pages) = ProcessReader(archive, reader, outputFile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
(save, num_pages) = ProcessArchive(archive, outputFile, filename);
|
|
||||||
if (num_pages == 0) num_pages = 1;
|
|
||||||
long elapsed = sw.ElapsedMilliseconds;
|
|
||||||
Logger.Log($"\r\nFinished({save.ToString("0.##")}%) [{elapsed}][{elapsed / num_pages}]: " + filename, LogLevel.Verbose, col: Color.Green);
|
|
||||||
}
|
|
||||||
|
|
||||||
private (double, int) ProcessReader(IArchive archive, IReader reader, string outputPath)
|
|
||||||
{
|
|
||||||
var encoder = new SimpleEncoder();
|
|
||||||
|
|
||||||
|
|
||||||
bool cover = true;
|
|
||||||
double save = 0.0;
|
|
||||||
int nop = 0;
|
|
||||||
using (var output = ZipArchive.Create())
|
|
||||||
{
|
|
||||||
var imageStreams = new List<Stream>();
|
|
||||||
|
|
||||||
while (reader.MoveToNextEntry())
|
|
||||||
{
|
|
||||||
if (!reader.Entry.IsDirectory)
|
|
||||||
{
|
|
||||||
//Console.WriteLine(reader.Entry.Key);
|
|
||||||
|
|
||||||
if (reader.Entry.Key.StartsWith("__MACOSX"))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
using (var entryStream = reader.OpenEntryStream())
|
|
||||||
{
|
|
||||||
|
|
||||||
string entry_key_lower = reader.Entry.Key.ToLower();
|
|
||||||
if (!entry_key_lower.EndsWith(".jpg") &&
|
|
||||||
!entry_key_lower.EndsWith(".png") &&
|
|
||||||
!entry_key_lower.EndsWith(".bmp") &&
|
|
||||||
!entry_key_lower.EndsWith(".ppm") &&
|
|
||||||
!entry_key_lower.EndsWith(".pbm") &&
|
|
||||||
!entry_key_lower.EndsWith(".gif") &&
|
|
||||||
!entry_key_lower.EndsWith(".jpeg"))
|
|
||||||
{
|
|
||||||
var ms = new MemoryStream();
|
|
||||||
imageStreams.Add(ms);
|
|
||||||
entryStream.CopyTo(ms);
|
|
||||||
output.AddEntry(reader.Entry.Key, ms);
|
|
||||||
Logger.Log("o", LogLevel.Verbose, false, col: Color.PaleGreen);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
nop++;
|
|
||||||
|
|
||||||
if (cover)
|
|
||||||
{
|
|
||||||
var ms = new MemoryStream();
|
|
||||||
imageStreams.Add(ms);
|
|
||||||
entryStream.CopyTo(ms);
|
|
||||||
output.AddEntry(reader.Entry.Key, ms);
|
|
||||||
Logger.Log("C", LogLevel.Verbose, false, col: Color.Green);
|
|
||||||
cover = false;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
ProcessReaderEntry(reader, entryStream, imageStreams, output, encoder);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
reader.Dispose();
|
|
||||||
|
|
||||||
Directory.CreateDirectory(Path.GetDirectoryName(outputPath));
|
|
||||||
|
|
||||||
output.SaveTo(outputPath, CompressionType.Deflate);
|
|
||||||
|
|
||||||
//output.SaveTo(outputPath, CompressionType.None);
|
|
||||||
|
|
||||||
imageStreams.ForEach(i => i.Dispose());
|
|
||||||
}
|
|
||||||
|
|
||||||
long output_length = new System.IO.FileInfo(outputPath).Length;
|
|
||||||
|
|
||||||
save = 100 * (double)output_length / (double)archive.TotalSize;
|
|
||||||
|
|
||||||
return (save, nop);
|
|
||||||
}
|
|
||||||
public int GetPlace(int value, int place)
|
|
||||||
{
|
|
||||||
return ((value % (place * 10)) - (value % place)) / place;
|
|
||||||
}
|
|
||||||
private (double, int) ProcessArchive(IArchive archive, string outputPath, string inputPath)
|
|
||||||
{
|
|
||||||
//var fileEntries = archive.Entries.Where(e => !e.IsDirectory);
|
|
||||||
var fileEntries = archive.Entries.Where(e => !e.IsDirectory).OrderBy(e => e.Key);
|
|
||||||
|
|
||||||
var encoder = new SimpleEncoder();
|
|
||||||
|
|
||||||
bool cover = true;
|
|
||||||
double save = 0.0;
|
|
||||||
int nop = 0;
|
|
||||||
using (var output = ZipArchive.Create())
|
|
||||||
{
|
|
||||||
var imageStreams = new List<Stream>();
|
|
||||||
int count = 0;
|
|
||||||
foreach (var entry in fileEntries)
|
|
||||||
{
|
|
||||||
(bool res, bool skipped) = ProcessEntry(entry, imageStreams, output, encoder, cover);
|
|
||||||
if (res)
|
|
||||||
cover = false;
|
|
||||||
count++;
|
|
||||||
if (!skipped)
|
|
||||||
nop++;
|
|
||||||
if (count % 10 == 0)
|
|
||||||
{
|
|
||||||
string digit = GetPlace(count, 10).ToString();
|
|
||||||
Logger.Log(digit, LogLevel.Verbose, false, col: Color.Green);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
archive.Dispose();
|
|
||||||
|
|
||||||
Directory.CreateDirectory(Path.GetDirectoryName(outputPath));
|
|
||||||
|
|
||||||
// output.SaveTo(outputPath, CompressionType.Deflate);
|
|
||||||
output.SaveTo(outputPath, CompressionType.None);
|
|
||||||
|
|
||||||
//output.SaveTo(outputPath, CompressionType.None);
|
|
||||||
|
|
||||||
imageStreams.ForEach(i => i.Dispose());
|
|
||||||
|
|
||||||
output.Dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
long output_length = new System.IO.FileInfo(outputPath).Length;
|
|
||||||
|
|
||||||
save = 100 * (double)output_length / (double)archive.TotalSize;
|
|
||||||
|
|
||||||
Program.file_stat fs = null;
|
|
||||||
Program.File_statistics.TryGetValue(inputPath, out fs);
|
|
||||||
if (fs != null)
|
|
||||||
{
|
|
||||||
fs.Uncompressed_file_len = archive.TotalSize;
|
|
||||||
fs.Compressed_file_len = output_length;
|
|
||||||
Program.File_statistics.TryAdd(inputPath, fs);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return (save, nop);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private (bool, bool) ProcessEntry(IArchiveEntry entry, IList<Stream> imageStreams, ZipArchive output, SimpleEncoder encoder, bool cover)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (entry.IsEncrypted)
|
|
||||||
{
|
|
||||||
Logger.Log("X", LogLevel.Verbose, false, col: Color.Yellow);
|
|
||||||
return (false, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
using (var stream = entry.OpenEntryStream())
|
|
||||||
{
|
|
||||||
|
|
||||||
if (entry.Key.StartsWith("__MACOSX"))
|
|
||||||
{
|
|
||||||
return (false, true);
|
|
||||||
}
|
|
||||||
string entry_key_lower = entry.Key.ToLower();
|
|
||||||
bool isPPM = entry_key_lower.EndsWith(".ppm");
|
|
||||||
bool isPBM = entry_key_lower.EndsWith(".pbm");
|
|
||||||
|
|
||||||
if (!entry_key_lower.EndsWith(".jpg") &&
|
|
||||||
!entry_key_lower.EndsWith(".png") &&
|
|
||||||
!entry_key_lower.EndsWith(".bmp") &&
|
|
||||||
!entry_key_lower.EndsWith(".ppm") &&
|
|
||||||
!entry_key_lower.EndsWith(".pbm") &&
|
|
||||||
!entry_key_lower.EndsWith(".gif") &&
|
|
||||||
!entry_key_lower.EndsWith(".jpeg"))
|
|
||||||
{
|
|
||||||
var ms = new MemoryStream();
|
|
||||||
imageStreams.Add(ms);
|
|
||||||
stream.CopyTo(ms);
|
|
||||||
output.AddEntry(entry.Key, ms);
|
|
||||||
Logger.Log("o", LogLevel.Verbose, false, col: Color.Green);
|
|
||||||
return (false, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cover && !isPPM && !isPBM)
|
|
||||||
{
|
|
||||||
var ms = new MemoryStream();
|
|
||||||
imageStreams.Add(ms);
|
|
||||||
stream.CopyTo(ms);
|
|
||||||
output.AddEntry(entry.Key, ms);
|
|
||||||
Logger.Log("C", LogLevel.Verbose, false, col: Color.Green);
|
|
||||||
return (true, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
Bitmap bits;
|
|
||||||
|
|
||||||
var raw_ms = new MemoryStream();
|
|
||||||
stream.CopyTo(raw_ms);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (isPPM)
|
|
||||||
{
|
|
||||||
Logger.Log("P", LogLevel.Verbose, false, col: Color.PaleGreen);
|
|
||||||
PixelMap ppm = new PixelMap(raw_ms);
|
|
||||||
//bits = ppm.Bitmap;
|
|
||||||
bits = ppm.BitMap;
|
|
||||||
Logger.Log("\b", LogLevel.Verbose, false, col: Color.PaleGreen);
|
|
||||||
}
|
|
||||||
else if (isPBM)
|
|
||||||
{
|
|
||||||
Logger.Log("B", LogLevel.Verbose, false, col: Color.PaleGreen);
|
|
||||||
PixelMap pbm = new PixelMap(raw_ms);
|
|
||||||
bits = pbm.BitMap;
|
|
||||||
Logger.Log("\b", LogLevel.Verbose, false, col: Color.PaleGreen);
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
bits = new Bitmap(raw_ms);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Logger.LogError("Error parsing bitmap: " + entry.Key, col: Color.Red);
|
|
||||||
Logger.LogDebug(e, LogLevel.Error, col: Color.Red);
|
|
||||||
return (false, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bits.PixelFormat != System.Drawing.Imaging.PixelFormat.Format24bppRgb)
|
|
||||||
{
|
|
||||||
var newBits = ChangePixelFormat(bits);
|
|
||||||
bits.Dispose();
|
|
||||||
bits = newBits;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var ms = new MemoryStream();
|
|
||||||
encoder.Encode(bits, ms, Quality);
|
|
||||||
if (ms.Length < entry.Size || isPBM)
|
|
||||||
{
|
|
||||||
imageStreams.Add(ms);
|
|
||||||
output.AddEntry(entry.Key + ".webp", ms);
|
|
||||||
Logger.Log(".", LogLevel.Verbose, false, col: Color.PaleGreen);
|
|
||||||
|
|
||||||
// release not used stream
|
|
||||||
raw_ms.Dispose();
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
imageStreams.Add(raw_ms);
|
|
||||||
|
|
||||||
raw_ms.Seek(0, SeekOrigin.Begin);
|
|
||||||
//stream.Seek(0,SeekOrigin.Begin);
|
|
||||||
output.AddEntry(entry.Key, raw_ms);
|
|
||||||
Logger.Log("=", LogLevel.Verbose, false, col: Color.Green);
|
|
||||||
|
|
||||||
// release not used stream
|
|
||||||
ms.Dispose();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Logger.LogError("Error encoding entry: " + entry.Key, col: Color.Red);
|
|
||||||
Logger.LogDebug(e, LogLevel.Error, col: Color.Red);
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
bits.Dispose();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Logger.LogError("Error Archive Extraction: " + entry.Key, col: Color.Red);
|
|
||||||
Logger.LogDebug(e, LogLevel.Error, col: Color.Red);
|
|
||||||
return (false, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
Process proc = Process.GetCurrentProcess();
|
|
||||||
//Logger.LogDebug($"M {proc.PrivateMemorySize64} - D {proc.PrivateMemorySize64 - last_mem}", LogLevel.Verbose);
|
|
||||||
//last_mem = proc.PrivateMemorySize64;
|
|
||||||
return (false, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ProcessReaderEntry(IReader reader, EntryStream entry, IList<Stream> imageStreams, ZipArchive output, SimpleEncoder encoder)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var stream = entry;
|
|
||||||
// using (var stream = entry.OpenEntryStream())
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
Bitmap bits;
|
|
||||||
|
|
||||||
var raw_ms = new MemoryStream();
|
|
||||||
imageStreams.Add(raw_ms);
|
|
||||||
stream.CopyTo(raw_ms);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
bits = new Bitmap(raw_ms);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Logger.LogError("Error parsing bitmap: " + reader.Entry.Key, col: Color.Red);
|
|
||||||
Logger.LogDebug(e, LogLevel.Error, col: Color.Red);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bits.PixelFormat != System.Drawing.Imaging.PixelFormat.Format24bppRgb)
|
|
||||||
{
|
|
||||||
var newBits = ChangePixelFormat(bits);
|
|
||||||
bits.Dispose();
|
|
||||||
bits = newBits;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var ms = new MemoryStream();
|
|
||||||
encoder.Encode(bits, ms, Quality);
|
|
||||||
if (ms.Length < reader.Entry.Size)
|
|
||||||
{
|
|
||||||
imageStreams.Add(ms);
|
|
||||||
output.AddEntry(reader.Entry.Key + ".webp", ms);
|
|
||||||
Logger.Log("s", LogLevel.Verbose, false, col: Color.Green);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
raw_ms.Seek(0, SeekOrigin.Begin);
|
|
||||||
//stream.Seek(0,SeekOrigin.Begin);
|
|
||||||
output.AddEntry(reader.Entry.Key, raw_ms);
|
|
||||||
Logger.Log("=", LogLevel.Verbose, false, col: Color.Green);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Logger.LogError("Error encoding entry: " + reader.Entry.Key, col: Color.Red);
|
|
||||||
Logger.LogDebug(e, LogLevel.Error, col: Color.Red);
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
bits.Dispose();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Logger.LogError("Error Archive Extraction: " + reader.Entry.Key, col: Color.Red);
|
|
||||||
Logger.LogDebug(e, LogLevel.Error, col: Color.Red);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Bitmap ChangePixelFormat(Bitmap orig, System.Drawing.Imaging.PixelFormat format = System.Drawing.Imaging.PixelFormat.Format24bppRgb)
|
|
||||||
{
|
|
||||||
Bitmap clone = new Bitmap(orig.Width, orig.Height, format);
|
|
||||||
|
|
||||||
using (Graphics gr = Graphics.FromImage(clone))
|
|
||||||
{
|
|
||||||
gr.DrawImage(orig, new Rectangle(0, 0, clone.Width, clone.Height));
|
|
||||||
}
|
|
||||||
|
|
||||||
return clone;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void CompressPdf(string filename, string outputFile = null)
|
|
||||||
{
|
|
||||||
new ImageExtractor(Logger).ExtractImagesFromFile(filename, outputFile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+22
-26
@@ -22,7 +22,7 @@ using Xabe.FFmpeg;
|
|||||||
using SharpCompress.Archives;
|
using SharpCompress.Archives;
|
||||||
using SharpCompress.Archives.Zip;
|
using SharpCompress.Archives.Zip;
|
||||||
using SharpCompress.Common;
|
using SharpCompress.Common;
|
||||||
using itext.pdfimage.Extensions;
|
//using itext.pdfimage.Extensions;
|
||||||
using org.omg.PortableInterceptor;
|
using org.omg.PortableInterceptor;
|
||||||
using org.apache.pdfbox.util.@operator;
|
using org.apache.pdfbox.util.@operator;
|
||||||
using java.nio;
|
using java.nio;
|
||||||
@@ -40,12 +40,15 @@ using iMGcompress_core;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
using iMGcompress_core;
|
||||||
|
using Compressor = iMGcompress_core.Compressor;
|
||||||
|
|
||||||
namespace ComicCompressor
|
namespace ComicCompressor
|
||||||
{
|
{
|
||||||
public class Program
|
public class Program
|
||||||
{
|
{
|
||||||
|
|
||||||
// string progVersion = "Version 2.0.0 - (04/07/2024)";
|
// string progVersion = "Version 2.0.0 - (04/07/2024)";
|
||||||
|
|
||||||
// Added copy of non image files with same name
|
// Added copy of non image files with same name
|
||||||
//string progVersion = "Version 2.0.1 - (12/08/2024)";
|
//string progVersion = "Version 2.0.1 - (12/08/2024)";
|
||||||
@@ -54,8 +57,13 @@ namespace ComicCompressor
|
|||||||
//string progVersion = "Version 2.0.2 - (27/08/2024)";
|
//string progVersion = "Version 2.0.2 - (27/08/2024)";
|
||||||
|
|
||||||
// Completed support for ZEBRA PRN files, generate image and base64 for prn and image. Using URI format for base64 files
|
// Completed support for ZEBRA PRN files, generate image and base64 for prn and image. Using URI format for base64 files
|
||||||
string progVersion = "Version 2.1.0 - (28/08/2024)";
|
//string progVersion = "Version 2.1.0 - (28/08/2024)";
|
||||||
|
|
||||||
|
// Moved functionalities to library iMGcompress-core
|
||||||
|
//string progVersion = "Version 3.0.0 - (21/11/2024)";
|
||||||
|
|
||||||
|
// In core changed color of percent save to white
|
||||||
|
string progVersion = "Version 3.0.1 - (23/01/2025)";
|
||||||
public static int Main(string[] args) => CommandLineApplication.Execute<Program>(args);
|
public static int Main(string[] args) => CommandLineApplication.Execute<Program>(args);
|
||||||
|
|
||||||
#region INPUT_FLAGS
|
#region INPUT_FLAGS
|
||||||
@@ -84,7 +92,6 @@ namespace ComicCompressor
|
|||||||
[Option("-c|--cpu", Description = "Run in parallel, use given number of CPUs")]
|
[Option("-c|--cpu", Description = "Run in parallel, use given number of CPUs")]
|
||||||
public int NumOfCpu { get; } = Environment.ProcessorCount;
|
public int NumOfCpu { get; } = Environment.ProcessorCount;
|
||||||
|
|
||||||
|
|
||||||
[Option("-d|--pdf", Description = "Process pdf only")]
|
[Option("-d|--pdf", Description = "Process pdf only")]
|
||||||
public bool DoPdf { get; } = false;
|
public bool DoPdf { get; } = false;
|
||||||
|
|
||||||
@@ -100,18 +107,6 @@ namespace ComicCompressor
|
|||||||
|
|
||||||
#region STATISTICS
|
#region STATISTICS
|
||||||
|
|
||||||
public class file_stat
|
|
||||||
{
|
|
||||||
public string Filename { get; set; }
|
|
||||||
public file_stat(string filename) {
|
|
||||||
Filename = filename;
|
|
||||||
}
|
|
||||||
public long Uncompressed_file_len { get; set; }
|
|
||||||
public long Compressed_file_len { get; set; }
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static Dictionary <string, file_stat> file_statistics = new Dictionary<string, file_stat>();
|
static Dictionary <string, file_stat> file_statistics = new Dictionary<string, file_stat>();
|
||||||
public static Dictionary<string, file_stat> File_statistics { get => file_statistics; set => file_statistics = value; }
|
public static Dictionary<string, file_stat> File_statistics { get => file_statistics; set => file_statistics = value; }
|
||||||
|
|
||||||
@@ -169,13 +164,14 @@ namespace ComicCompressor
|
|||||||
|
|
||||||
Logger.Log(progVersion, LogLevel.Verbose, true);
|
Logger.Log(progVersion, LogLevel.Verbose, true);
|
||||||
|
|
||||||
var progress = new Progress<ProgressInfo>( p => Logger.Log(p.ToString(), LogLevel.Verbose, true) );
|
//var progress = new Progress<ProgressInfo>( p => Logger.Log(p.ToString(), LogLevel.Verbose, true) );
|
||||||
FFmpeg.SetExecutablesPath(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location));
|
//FFmpeg.SetExecutablesPath(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location));
|
||||||
FFmpegDownloader.GetLatestVersion(FFmpegVersion.Official,progress);
|
//FFmpegDownloader.GetLatestVersion(FFmpegVersion.Official,progress);
|
||||||
|
|
||||||
|
|
||||||
//FFmpeg.SetExecutablesPath (Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "FFmpeg"));
|
//==//FFmpeg.SetExecutablesPath (Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "FFmpeg"));
|
||||||
Logger.Log(FFmpeg.ExecutablesPath, LogLevel.Verbose, true);
|
|
||||||
|
//Logger.Log(FFmpeg.ExecutablesPath, LogLevel.Verbose, true);
|
||||||
|
|
||||||
|
|
||||||
IList<string> files = new FileParser().ListAllFiles(Input, Recursive);
|
IList<string> files = new FileParser().ListAllFiles(Input, Recursive);
|
||||||
@@ -299,7 +295,7 @@ namespace ComicCompressor
|
|||||||
{
|
{
|
||||||
long lengthin = new System.IO.FileInfo(filename).Length;
|
long lengthin = new System.IO.FileInfo(filename).Length;
|
||||||
long lengthout = new System.IO.FileInfo(outputPath).Length;
|
long lengthout = new System.IO.FileInfo(outputPath).Length;
|
||||||
Program.file_stat fs = null;
|
file_stat fs = null;
|
||||||
Program.File_statistics.TryGetValue(filename, out fs);
|
Program.File_statistics.TryGetValue(filename, out fs);
|
||||||
if (fs != null)
|
if (fs != null)
|
||||||
{
|
{
|
||||||
@@ -316,7 +312,7 @@ namespace ComicCompressor
|
|||||||
{
|
{
|
||||||
long lengthin = new System.IO.FileInfo(filename).Length;
|
long lengthin = new System.IO.FileInfo(filename).Length;
|
||||||
long lengthout = new System.IO.FileInfo(outputPath_webp).Length;
|
long lengthout = new System.IO.FileInfo(outputPath_webp).Length;
|
||||||
Program.file_stat fs = null;
|
file_stat fs = null;
|
||||||
Program.File_statistics.TryGetValue(filename, out fs);
|
Program.File_statistics.TryGetValue(filename, out fs);
|
||||||
if (fs != null)
|
if (fs != null)
|
||||||
{
|
{
|
||||||
@@ -336,7 +332,7 @@ namespace ComicCompressor
|
|||||||
|
|
||||||
long lengthin = new System.IO.FileInfo(filename).Length;
|
long lengthin = new System.IO.FileInfo(filename).Length;
|
||||||
long lengthout = new System.IO.FileInfo(outputPath).Length;
|
long lengthout = new System.IO.FileInfo(outputPath).Length;
|
||||||
Program.file_stat fs = null;
|
file_stat fs = null;
|
||||||
Program.File_statistics.TryGetValue(filename, out fs);
|
Program.File_statistics.TryGetValue(filename, out fs);
|
||||||
if (fs != null)
|
if (fs != null)
|
||||||
{
|
{
|
||||||
@@ -422,7 +418,7 @@ namespace ComicCompressor
|
|||||||
|
|
||||||
long lengthin = new System.IO.FileInfo(filename).Length;
|
long lengthin = new System.IO.FileInfo(filename).Length;
|
||||||
long lengthout = new System.IO.FileInfo(outputPath).Length;
|
long lengthout = new System.IO.FileInfo(outputPath).Length;
|
||||||
Program.file_stat fs = null;
|
file_stat fs = null;
|
||||||
Program.File_statistics.TryGetValue(filename, out fs);
|
Program.File_statistics.TryGetValue(filename, out fs);
|
||||||
if (fs != null)
|
if (fs != null)
|
||||||
{
|
{
|
||||||
@@ -464,7 +460,7 @@ namespace ComicCompressor
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
compressor.Compress(filename, outputPath);
|
compressor.Compress(filename, outputPath, file_statistics);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -26,11 +26,16 @@
|
|||||||
},
|
},
|
||||||
"DEV_UFF": {
|
"DEV_UFF": {
|
||||||
"commandName": "Project",
|
"commandName": "Project",
|
||||||
"commandLineArgs": "-i \"E:\\SynologyDrive\\SynologyDrive\\A\\_PRINT_TEMPLATES_\\DEV_IN\" -o \"E:\\SynologyDrive\\SynologyDrive\\A\\_PRINT_TEMPLATES_\\DEV_OUT\" -r -s -j -a -n"
|
"commandLineArgs": "-i \"E:\\SynologyDrive\\SynologyDrive\\A\\_PRINT_TEMPLATES_\\DEV_IN\" -o \"E:\\SynologyDrive\\SynologyDrive\\A\\_PRINT_TEMPLATES_\\DEV_OUT\" -r -s -j -a -n",
|
||||||
|
"nativeDebugging": true
|
||||||
},
|
},
|
||||||
"DEV_HOME": {
|
"DEV_HOME": {
|
||||||
"commandName": "Project",
|
"commandName": "Project",
|
||||||
"commandLineArgs": "-i \"D:\\SynologyDrive\\A\\_PRINT_TEMPLATES_\\DEV_IN\" -o \"D:\\SynologyDrive\\A\\_PRINT_TEMPLATES_\\DEV_OUT\" -r -s -j -a -n"
|
"commandLineArgs": "-i \"D:\\SynologyDrive\\A\\_PRINT_TEMPLATES_\\DEV_IN\" -o \"D:\\SynologyDrive\\A\\_PRINT_TEMPLATES_\\DEV_OUT\" -r -s -j -a -n"
|
||||||
|
},
|
||||||
|
"ComicCompress CBx": {
|
||||||
|
"commandName": "Project",
|
||||||
|
"commandLineArgs": "-i _IMG_ -o _IMG_PDF_ -r -s -d"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user