Add ImageSerializer/Deserializer

This commit is contained in:
miku-666
2024-04-05 00:32:36 +02:00
parent c287d7c03f
commit 29ee312d71
5 changed files with 83 additions and 20 deletions

View File

@@ -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);
}

View File

@@ -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<T>(this PckFileData file, IPckDeserializer<T> deserializer)
{

View File

@@ -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<Image>
{
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;
}
}
}
}

View File

@@ -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<Image>
{
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);
}
}
}
}

View File

@@ -138,7 +138,7 @@
<Compile Include="Extensions\LocFileExtensions.cs" />
<Compile Include="Extensions\PckFileDataExtensions.cs" />
<Compile Include="Extensions\TreeNodeExtensions.cs" />
<Compile Include="Internal\AnimationSerializer.cs" />
<Compile Include="Internal\Deserializer\ImageDeserializer.cs" />
<Compile Include="Internal\Serializer\AnimationSerializer.cs" />
<Compile Include="Internal\Deserializer\AnimationDeserializer.cs" />
<Compile Include="Interfaces\IPckDeserializer.cs" />
@@ -148,6 +148,7 @@
<Compile Include="Internal\ResourceCategory.cs" />
<Compile Include="Internal\CommitInfo.cs" />
<Compile Include="Internal\ResourceLocation.cs" />
<Compile Include="Internal\Serializer\ImageSerializer.cs" />
<Compile Include="Internal\SkinAnimFlag.cs" />
<Compile Include="Internal\SkinAnimMask.cs" />
<Compile Include="Properties\Resources.Designer.cs">