pixelmap/compressor - added support for pbm P4

moved to .net 8.0
This commit is contained in:
Marco Giuntoni
2024-05-11 10:31:24 +02:00
parent 035652d292
commit c6954071c8
3 changed files with 144 additions and 35 deletions
+47 -33
View File
@@ -14,6 +14,9 @@ using javax.swing.plaf;
using SharpCompress.Readers;
using SharpCompress.Writers;
using SharpCompress.Compressors.Xz;
//using SixLabors.ImageSharp;
//using SixLabors.ImageSharp;
//using SixLabors.ImageSharp.Processing;
namespace ComicCompressor
{
@@ -29,7 +32,7 @@ namespace ComicCompressor
Logger = logger;
}
public void Compress(string filename, string outputFile = null)
public void Compress(string filename, string outputFile = null)
{
Stopwatch sw = Stopwatch.StartNew();
outputFile = Path.ChangeExtension(outputFile ?? filename, "cbz");
@@ -72,18 +75,18 @@ namespace ComicCompressor
}
//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);
Logger.Log($"Processing[{archive.Entries.Count()}]: ", LogLevel.Verbose, false);
Logger.Log(filename, LogLevel.Verbose, col: Color.Green);
double save = 0;
int num_pages =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);
(save, num_pages) = ProcessReader(archive, reader, outputFile);
}
}
}
@@ -91,13 +94,13 @@ namespace ComicCompressor
(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);
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;
@@ -125,6 +128,7 @@ namespace ComicCompressor
!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"))
{
@@ -169,7 +173,7 @@ namespace ComicCompressor
save = 100 * (double)output_length / (double)archive.TotalSize;
return (save,nop);
return (save, nop);
}
public int GetPlace(int value, int place)
{
@@ -189,10 +193,10 @@ namespace ComicCompressor
{
var imageStreams = new List<Stream>();
int count = 0;
foreach (var entry in fileEntries)
foreach (var entry in fileEntries)
{
(bool res, bool skipped) = ProcessEntry(entry, imageStreams, output, encoder, cover);
if (res)
if (res)
cover = false;
count++;
if (!skipped)
@@ -202,15 +206,15 @@ namespace ComicCompressor
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);
imageStreams.ForEach(i => i.Dispose());
@@ -223,15 +227,15 @@ namespace ComicCompressor
save = 100 * (double)output_length / (double)archive.TotalSize;
Program.file_stat fs = null;
Program.File_statistics.TryGetValue(inputPath,out fs);
if(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);
}
@@ -243,25 +247,27 @@ namespace ComicCompressor
{
if (entry.IsEncrypted)
{
Logger.Log("X", LogLevel.Verbose, false, col: Color.Yellow);
return (false,true);
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);
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") &&
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"))
{
@@ -273,13 +279,13 @@ namespace ComicCompressor
return (false, true);
}
if (cover && !isPPM)
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);
Logger.Log("C", LogLevel.Verbose, false, col: Color.Green);
return (true, false);
}
@@ -288,8 +294,8 @@ namespace ComicCompressor
var raw_ms = new MemoryStream();
stream.CopyTo(raw_ms);
try
{
if(isPPM)
{
if (isPPM)
{
Logger.Log("P", LogLevel.Verbose, false, col: Color.PaleGreen);
PixelMap ppm = new PixelMap(raw_ms);
@@ -297,6 +303,14 @@ namespace ComicCompressor
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);
@@ -305,7 +319,7 @@ namespace ComicCompressor
catch (Exception e)
{
Logger.LogError("Error parsing bitmap: " + entry.Key, col: Color.Red);
Logger.LogDebug(e, LogLevel.Error, col:Color.Red);
Logger.LogDebug(e, LogLevel.Error, col: Color.Red);
return (false, true);
}
@@ -320,7 +334,7 @@ namespace ComicCompressor
{
var ms = new MemoryStream();
encoder.Encode(bits, ms, Quality);
if (ms.Length < entry.Size)
if (ms.Length < entry.Size || isPBM)
{
imageStreams.Add(ms);
output.AddEntry(entry.Key + ".webp", ms);
@@ -364,15 +378,15 @@ namespace ComicCompressor
Process proc = Process.GetCurrentProcess();
//Logger.LogDebug($"M {proc.PrivateMemorySize64} - D {proc.PrivateMemorySize64 - last_mem}", LogLevel.Verbose);
//last_mem = proc.PrivateMemorySize64;
return (false,false);
return (false, false);
}
private void ProcessReaderEntry(IReader reader,EntryStream entry, IList<Stream> imageStreams, ZipArchive output, SimpleEncoder encoder)
private void ProcessReaderEntry(IReader reader, EntryStream entry, IList<Stream> imageStreams, ZipArchive output, SimpleEncoder encoder)
{
try
{
var stream = entry;
// using (var stream = entry.OpenEntryStream())
// using (var stream = entry.OpenEntryStream())
{
@@ -389,7 +403,7 @@ namespace ComicCompressor
{
Logger.LogError("Error parsing bitmap: " + reader.Entry.Key, col: Color.Red);
Logger.LogDebug(e, LogLevel.Error, col: Color.Red);
return ;
return;
}
if (bits.PixelFormat != System.Drawing.Imaging.PixelFormat.Format24bppRgb)
@@ -435,14 +449,14 @@ namespace ComicCompressor
return;
}
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))
using (Graphics gr = Graphics.FromImage(clone))
{
gr.DrawImage(orig, new Rectangle(0, 0, clone.Width, clone.Height));
}