diff --git a/PCK-Studio/Classes/IO/TGA/TGASerializer.cs b/PCK-Studio/Classes/IO/TGA/TGASerializer.cs index ce018242..dd4254f5 100644 --- a/PCK-Studio/Classes/IO/TGA/TGASerializer.cs +++ b/PCK-Studio/Classes/IO/TGA/TGASerializer.cs @@ -24,7 +24,7 @@ namespace PckStudio.IO.TGA { private static TGAWriter writer = new TGAWriter(); - public static void SerializeToStream(ref Stream stream, Image image) + public static void SerializeToStream(Stream stream, Image image) { writer.WriteToStream(stream, image); } diff --git a/PCK-Studio/Extensions/PckFileDataExtensions.cs b/PCK-Studio/Extensions/PckFileDataExtensions.cs index 44d9ccad..8b04efc0 100644 --- a/PCK-Studio/Extensions/PckFileDataExtensions.cs +++ b/PCK-Studio/Extensions/PckFileDataExtensions.cs @@ -11,6 +11,8 @@ using OMI.Formats.Pck; using OMI.Workers; using PckStudio.Interfaces; using PckStudio.IO.TGA; +using PckStudio.Internal.Deserializer; +using PckStudio.Internal.Serializer; namespace PckStudio.Extensions { @@ -18,8 +20,6 @@ namespace PckStudio.Extensions { private const string MipMap = "MipMapLevel"; - private static Image EmptyImage = new Bitmap(1, 1, PixelFormat.Format32bppArgb); - internal static Image GetTexture(this PckFileData file) { if (file.Filetype != PckFileType.SkinFile && @@ -28,23 +28,8 @@ namespace PckStudio.Extensions { throw new Exception("File is not suitable to contain image data."); } - using (var stream = new MemoryStream(file.Data)) - { - try - { - if (Path.GetExtension(file.Filename) == ".tga") - return TGADeserializer.DeserializeFromStream(stream); - else - return Image.FromStream(stream); + return file.Get(ImageDeserializer.DefaultDeserializer); } - catch(Exception ex) - { - Trace.WriteLine($"Failed to read image from pck file data({file.Filename}).", category: nameof(PckFileDataExtensions) + "." + nameof(GetTexture)); - Debug.WriteLine(ex.Message); - return EmptyImage; - } - } - } internal static T Get(this PckFileData file, IPckDeserializer deserializer) { diff --git a/PCK-Studio/Internal/Deserializer/ImageDeserializer.cs b/PCK-Studio/Internal/Deserializer/ImageDeserializer.cs new file mode 100644 index 00000000..4747fb96 --- /dev/null +++ b/PCK-Studio/Internal/Deserializer/ImageDeserializer.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using OMI.Formats.Pck; +using PckStudio.Interfaces; +using PckStudio.IO.TGA; + +namespace PckStudio.Internal.Deserializer +{ + internal sealed class ImageDeserializer : IPckDeserializer + { + public static readonly ImageDeserializer DefaultDeserializer = new ImageDeserializer(); + private static Image EmptyImage = new Bitmap(1, 1, PixelFormat.Format32bppArgb); + + public Image Deserialize(PckFileData file) + { + using var stream = new MemoryStream(file.Data); + try + { + if (Path.GetExtension(file.Filename) == ".tga") + return TGADeserializer.DeserializeFromStream(stream); + else + return Image.FromStream(stream); + } + catch (Exception ex) + { + Trace.TraceError($"Failed to read image from pck file data({file.Filename})."); + Debug.WriteLine(ex.Message); + return EmptyImage; + } + } + } +} diff --git a/PCK-Studio/Internal/Serializer/ImageSerializer.cs b/PCK-Studio/Internal/Serializer/ImageSerializer.cs new file mode 100644 index 00000000..ed012ffc --- /dev/null +++ b/PCK-Studio/Internal/Serializer/ImageSerializer.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using OMI.Formats.Pck; +using PckStudio.Interfaces; +using PckStudio.IO.TGA; + +namespace PckStudio.Internal.Serializer +{ + internal sealed class ImageSerializer : IPckFileSerializer + { + public static readonly ImageSerializer DefaultSerializer = new ImageSerializer(); + + public void Serialize(Image obj, ref PckFileData file) + { + var stream = new MemoryStream(); + try + { + if (Path.GetExtension(file.Filename) == ".tga") + TGASerializer.SerializeToStream(stream, obj); + else + obj.Save(stream, ImageFormat.Png); + file.SetData(stream.ToArray()); + } + catch (Exception ex) + { + Trace.TraceError($"Failed to serialize image to pck file data({file.Filename})."); + Debug.WriteLine(ex.Message); + } + } + } +} diff --git a/PCK-Studio/PckStudio.csproj b/PCK-Studio/PckStudio.csproj index 55d947f2..44ad9d09 100644 --- a/PCK-Studio/PckStudio.csproj +++ b/PCK-Studio/PckStudio.csproj @@ -138,7 +138,7 @@ - + @@ -148,6 +148,7 @@ +