MPSSceneSerializer.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. using System;
  2. using System.IO;
  3. using System.Text;
  4. using Ionic.Zlib;
  5. using MeidoPhotoStudio.Plugin;
  6. namespace MeidoPhotoStudio.Converter;
  7. public static class MPSSceneSerializer
  8. {
  9. private const string NoThumbBase64 =
  10. "iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAIAAACRXR/mAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7D"
  11. + "AcdvqGQAAAFOSURBVFhH3dJbjoMwEETRLIRP9r+zrCGpqJABY+x+2Ua5ys9EcteJNK/3sj7ws7E+j2ln8Q9+O7eE2Vjpq4kdJTsLTZRl"
  12. + "jBMLTZFdDTkLDZYVAQUWGia7Wy+z0ABZZfqWhbrK6rs1Fuoka442WChcJllss1CgTDgnYqEQmXxLykJOmWpIwUJmmXZFx0IGmWFCzUKq"
  13. + "J7b7FhYSvjIfN7JQ86Hnsp2FKm+dZ10sVHzuv+lloexCyMEAFkpHoq7FsBDuBJ76a1Y6EnXtT//li8/9N12sylvnWTur+dBz2cgSvjIf"
  14. + "t7BUT2z31azePwOpWQYT064oWGYTUw1JWU4Tk2+JWCEmJpxrswJNTLLYYIWbWHO0xupkYvXdW1ZXE6tMl1kDTOxuvcAaZmJFQM4abGJX"
  15. + "w4k1xcQyxs6aaGJHycaabmIJ82M9xMTo2VjP+izrF8NPHwq3SYqeAAAAAElFTkSuQmCC";
  16. private static byte[]? noThumb;
  17. public static byte[] NoThumb =>
  18. noThumb ??= Convert.FromBase64String(NoThumbBase64);
  19. public static void SaveToFile(string filename, SceneMetadata metadata, byte[] rawSceneData, string? thumbnail)
  20. {
  21. var rawThumbnail = string.IsNullOrEmpty(thumbnail) ? NoThumb : Convert.FromBase64String(thumbnail);
  22. SaveToFile(filename, metadata, rawSceneData, rawThumbnail);
  23. }
  24. public static void SaveToFile(string filename, SceneMetadata metadata, byte[] rawSceneData, byte[] thumbnail)
  25. {
  26. if (!string.Equals(Path.GetExtension(filename), ".png", StringComparison.OrdinalIgnoreCase))
  27. filename += ".png";
  28. using var fileStream = File.Create(filename);
  29. fileStream.Write(thumbnail, 0, thumbnail.Length);
  30. using var headerWriter = new BinaryWriter(fileStream, Encoding.UTF8);
  31. headerWriter.Write(MeidoPhotoStudio.Plugin.MeidoPhotoStudio.SceneHeader);
  32. metadata.WriteMetadata(headerWriter);
  33. using var compressionStream = new DeflateStream(fileStream, CompressionMode.Compress);
  34. compressionStream.Write(rawSceneData, 0, rawSceneData.Length);
  35. compressionStream.Close();
  36. }
  37. public static string FormatDate(DateTime date) =>
  38. date.ToString("yyyyMMddHHmmss");
  39. }