Skip to content

Commit

Permalink
Writing PNG format
Browse files Browse the repository at this point in the history
  • Loading branch information
gitmylo committed Jun 8, 2023
1 parent 1739129 commit be43c54
Show file tree
Hide file tree
Showing 35 changed files with 135 additions and 511 deletions.
2 changes: 1 addition & 1 deletion TavernAICardLib/TavernAICardLib.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="MetadataExtractor" Version="2.8.0" />
<PackageReference Include="Hjg.Pngcs" Version="1.1.4" />
<PackageReference Include="System.Drawing.Common" Version="7.0.0" />
</ItemGroup>

Expand Down
86 changes: 63 additions & 23 deletions TavernAICardLib/TavernAiCard.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
using MetadataExtractor;
using Hjg.Pngcs;
using Hjg.Pngcs.Chunks;
using Directory = System.IO.Directory;

namespace TavernAICardLib;
Expand Down Expand Up @@ -87,35 +88,29 @@ public abstract class CardSaver
public abstract void Save(string filePath, TavernAiCard card);
}

// Loaders

public class ImageCardLoader : CardLoader
{
public override TavernAiCard Load(string filePath)
{
PngReader reader = FileHelper.CreatePngReader(filePath);
string data = reader.GetMetadata().GetTxtForKey("chara");
reader.End();

Image? image = null;
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
image = new Bitmap(filePath);
}
var directories = ImageMetadataReader.ReadMetadata(filePath);
foreach (var dir in directories)

string jsonData = Encoding.ASCII.GetString(Convert.FromBase64String(data));
TavernAiCard? card = JsonSerializer.Deserialize<TavernAiCard>(jsonData, new JsonSerializerOptions()
{
foreach (var tag in dir.Tags)
{
string[]? splitDesc = tag.Description?.Split(": ");
if (splitDesc != null && splitDesc[0] == "chara")
{
string jsonData = Encoding.ASCII.GetString(Convert.FromBase64String(splitDesc[1]));
TavernAiCard? card = JsonSerializer.Deserialize<TavernAiCard>(jsonData, new JsonSerializerOptions()
{
IncludeFields = true
});
if (card != null)
{
card.Image = image;
return card;
}
}
}
IncludeFields = true
});
if (card != null)
{
card.Image = image;
return card;
}

throw new NoMetaDataException(filePath);
Expand All @@ -140,6 +135,8 @@ public class JsonCardLoader : CardLoader
}
}

// Savers

public class JsonCardSaver : CardSaver
{
public override void Save(string filePath, TavernAiCard card)
Expand All @@ -159,10 +156,43 @@ public class ImageCardSaver : CardSaver
public override void Save(string filePath, TavernAiCard card)
{
if (card.Image == null) throw new NoImageException(filePath);
throw new NotImplementedException();
if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
throw new OsFileSaveException(filePath);
card.Image.Save(filePath);

// https://stackoverflow.com/a/32175522/
String tmpFile = "tmp.png";
PngReader reader = FileHelper.CreatePngReader(filePath);
PngWriter writer = FileHelper.CreatePngWriter(tmpFile, reader.ImgInfo, true);
int chunkBehav = ChunkCopyBehaviour.COPY_ALL_SAFE;
writer.CopyChunksFirst(reader, chunkBehav);
PngChunk chara = writer.GetMetadata().SetText("chara",
Convert.ToBase64String(
Encoding.ASCII.GetBytes(
JsonSerializer.Serialize(card)
)
)
);
chara.Priority = true;

int channels = reader.ImgInfo.Channels;
if (channels < 3)
throw new Exception("Image saving only works with RGB/RGBA images");
for (int row = 0; row < reader.ImgInfo.Rows; row++)
{
ImageLine l1 = reader.ReadRowInt(row); // format: RGBRGB... or RGBARGBA...
writer.WriteRow(l1, row);
}
writer.CopyChunksLast(reader, chunkBehav);
writer.End();
reader.End();
File.Delete(filePath);
File.Move(tmpFile, filePath);
}
}

// Exceptions

public class NoImageException : Exception
{
public NoImageException(string fileName)
Expand All @@ -180,5 +210,15 @@ public NoMetaDataException(string fileName)
Message = $"Failed to load {fileName}, No metadata.";
}

public override string Message { get; }
}

public class OsFileSaveException : Exception
{
public OsFileSaveException(string fileName)
{
Message = $"Failed to save {fileName}, Saving to image formats is only supported on Windows.";
}

public override string Message { get; }
}
66 changes: 9 additions & 57 deletions TavernAICardLib/bin/Debug/net6.0/TavernAICardLib.deps.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,26 +8,21 @@
".NETCoreApp,Version=v6.0": {
"TavernAICardLib/1.0.0": {
"dependencies": {
"MetadataExtractor": "2.8.0",
"Hjg.Pngcs": "1.1.4",
"System.Drawing.Common": "7.0.0"
},
"runtime": {
"TavernAICardLib.dll": {}
}
},
"MetadataExtractor/2.8.0": {
"dependencies": {
"System.Text.Encoding.CodePages": "4.5.1",
"XmpCore": "6.1.10.1"
},
"Hjg.Pngcs/1.1.4": {
"runtime": {
"lib/netstandard2.0/MetadataExtractor.dll": {
"assemblyVersion": "2.8.0.0",
"fileVersion": "2.8.0.0"
"lib/net6.0/Hjg.Pngcs.dll": {
"assemblyVersion": "1.1.4.0",
"fileVersion": "1.1.4.0"
}
}
},
"Microsoft.NETCore.Platforms/2.1.2": {},
"Microsoft.Win32.SystemEvents/7.0.0": {
"runtime": {
"lib/net6.0/Microsoft.Win32.SystemEvents.dll": {
Expand Down Expand Up @@ -62,21 +57,6 @@
"fileVersion": "7.0.22.51805"
}
}
},
"System.Runtime.CompilerServices.Unsafe/4.5.2": {},
"System.Text.Encoding.CodePages/4.5.1": {
"dependencies": {
"Microsoft.NETCore.Platforms": "2.1.2",
"System.Runtime.CompilerServices.Unsafe": "4.5.2"
}
},
"XmpCore/6.1.10.1": {
"runtime": {
"lib/netstandard2.0/XmpCore.dll": {
"assemblyVersion": "6.1.10.1",
"fileVersion": "6.1.10.1"
}
}
}
}
},
Expand All @@ -86,19 +66,12 @@
"serviceable": false,
"sha512": ""
},
"MetadataExtractor/2.8.0": {
"Hjg.Pngcs/1.1.4": {
"type": "package",
"serviceable": true,
"sha512": "sha512-p4sa1yRUZNU2S4febP3ewmM524QDZ7qSM+PamR7vKLThlEDM1Wz4VBxO48Nk31uakUVUQ7az0ULkOyt31i+q0Q==",
"path": "metadataextractor/2.8.0",
"hashPath": "metadataextractor.2.8.0.nupkg.sha512"
},
"Microsoft.NETCore.Platforms/2.1.2": {
"type": "package",
"serviceable": true,
"sha512": "sha512-mOJy3M0UN+LUG21dLGMxaWZEP6xYpQEpLuvuEQBaownaX4YuhH6NmNUlN9si+vNkAS6dwJ//N1O4DmLf2CikVg==",
"path": "microsoft.netcore.platforms/2.1.2",
"hashPath": "microsoft.netcore.platforms.2.1.2.nupkg.sha512"
"sha512": "sha512-uk7W9QPzgUIsCVHSCxKcr2ptzCMPXgCzfrlKMlGd7hICVBorvhyGdeThAO73yITpueIhHOolhGgHS3BwgZuo5Q==",
"path": "hjg.pngcs/1.1.4",
"hashPath": "hjg.pngcs.1.1.4.nupkg.sha512"
},
"Microsoft.Win32.SystemEvents/7.0.0": {
"type": "package",
Expand All @@ -113,27 +86,6 @@
"sha512": "sha512-KIX+oBU38pxkKPxvLcLfIkOV5Ien8ReN78wro7OF5/erwcmortzeFx+iBswlh2Vz6gVne0khocQudGwaO1Ey6A==",
"path": "system.drawing.common/7.0.0",
"hashPath": "system.drawing.common.7.0.0.nupkg.sha512"
},
"System.Runtime.CompilerServices.Unsafe/4.5.2": {
"type": "package",
"serviceable": true,
"sha512": "sha512-wprSFgext8cwqymChhrBLu62LMg/1u92bU+VOwyfBimSPVFXtsNqEWC92Pf9ofzJFlk4IHmJA75EDJn1b2goAQ==",
"path": "system.runtime.compilerservices.unsafe/4.5.2",
"hashPath": "system.runtime.compilerservices.unsafe.4.5.2.nupkg.sha512"
},
"System.Text.Encoding.CodePages/4.5.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-4J2JQXbftjPMppIHJ7IC+VXQ9XfEagN92vZZNoG12i+zReYlim5dMoXFC1Zzg7tsnKDM7JPo5bYfFK4Jheq44w==",
"path": "system.text.encoding.codepages/4.5.1",
"hashPath": "system.text.encoding.codepages.4.5.1.nupkg.sha512"
},
"XmpCore/6.1.10.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-/Tp2/e39e7z8hLtS4TXt0FNNZHbf5yNFfHS0/59soXlgOzZlyRZivvzWpvujyaWkTWWgecp/1nHxkuc5vntn7A==",
"path": "xmpcore/6.1.10.1",
"hashPath": "xmpcore.6.1.10.1.nupkg.sha512"
}
}
}
Binary file modified TavernAICardLib/bin/Debug/net6.0/TavernAICardLib.dll
Binary file not shown.
Binary file modified TavernAICardLib/bin/Debug/net6.0/TavernAICardLib.pdb
Binary file not shown.
Binary file modified TavernAICardLib/bin/Debug/net6.0/ref/TavernAICardLib.dll
Binary file not shown.
Binary file modified TavernAICardLib/obj/Debug/net6.0/TavernAICardLib.assets.cache
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -1 +1 @@
b7ca3ac241c91568ea292791729bcf72fb466699
7c75f7bcdaa1bb6eb747dc47eb3f297b047d8fb1
Binary file modified TavernAICardLib/obj/Debug/net6.0/TavernAICardLib.dll
Binary file not shown.
Binary file modified TavernAICardLib/obj/Debug/net6.0/TavernAICardLib.pdb
Binary file not shown.
Binary file modified TavernAICardLib/obj/Debug/net6.0/ref/TavernAICardLib.dll
Binary file not shown.
4 changes: 2 additions & 2 deletions TavernAICardLib/obj/TavernAICardLib.csproj.nuget.dgspec.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,9 @@
"net6.0": {
"targetAlias": "net6.0",
"dependencies": {
"MetadataExtractor": {
"Hjg.Pngcs": {
"target": "Package",
"version": "[2.8.0, )"
"version": "[1.1.4, )"
},
"System.Drawing.Common": {
"target": "Package",
Expand Down
Loading

0 comments on commit be43c54

Please sign in to comment.