parse star ratings from canon image metadata

This commit is contained in:
Colin McMillen 2023-07-25 09:41:13 -04:00
parent 7f375a6446
commit 3a9192b478

View File

@ -7,9 +7,11 @@ using OpenTK.Windowing.GraphicsLibraryFramework;
using Image = SixLabors.ImageSharp.Image; using Image = SixLabors.ImageSharp.Image;
using SixLabors.Fonts; using SixLabors.Fonts;
using SixLabors.ImageSharp.Metadata.Profiles.Exif; using SixLabors.ImageSharp.Metadata.Profiles.Exif;
using SixLabors.ImageSharp.Metadata.Profiles.Xmp;
using SixLabors.ImageSharp.Drawing.Processing; using SixLabors.ImageSharp.Drawing.Processing;
using SixLabors.ImageSharp.Drawing; using SixLabors.ImageSharp.Drawing;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Xml.Linq;
namespace SemiColinGames; namespace SemiColinGames;
@ -150,6 +152,7 @@ public class Photo {
public string FNumber = "<unk>"; public string FNumber = "<unk>";
public string ExposureTime = "<unk>"; public string ExposureTime = "<unk>";
public string IsoSpeed = "<unk>"; public string IsoSpeed = "<unk>";
public int Rating = 0;
private Texture texture; private Texture texture;
private Texture placeholder; private Texture placeholder;
@ -163,6 +166,7 @@ public class Photo {
public async void Load() { public async void Load() {
image = await Image.LoadAsync<Rgba32>(File); image = await Image.LoadAsync<Rgba32>(File);
ParseRating(image);
ExifProfile? exifs = image.Metadata.ExifProfile; ExifProfile? exifs = image.Metadata.ExifProfile;
if (exifs != null) { if (exifs != null) {
// FIXME: handle Orientation // FIXME: handle Orientation
@ -236,6 +240,29 @@ public class Photo {
} }
} }
private void ParseRating(Image image) {
XmpProfile? xmp = image.Metadata.XmpProfile;
if (xmp == null) {
return;
}
XDocument? doc = xmp.GetDocument();
if (doc == null) {
return;
}
XElement? root = doc.Root;
if (root == null) {
return;
}
foreach (XElement elt in root.Descendants()) {
if (elt.Name == "{http://ns.adobe.com/xap/1.0/}Rating") {
int rating;
if (int.TryParse(elt.Value, out rating)) {
Rating = rating;
}
}
}
}
public Texture Texture() { public Texture Texture() {
if (texture == placeholder && image != null) { if (texture == placeholder && image != null) {
texture = new Texture(image); texture = new Texture(image);
@ -512,9 +539,9 @@ public class Game : GameWindow {
GL.VertexAttribPointer(texCoordLocation, 2, VertexAttribPointerType.Float, false, 5 * sizeof(float), 3 * sizeof(float)); GL.VertexAttribPointer(texCoordLocation, 2, VertexAttribPointerType.Float, false, 5 * sizeof(float), 3 * sizeof(float));
// Load textures from JPEGs. // Load textures from JPEGs.
string[] files = Directory.GetFiles(@"c:\users\colin\desktop\photos-test\"); // string[] files = Directory.GetFiles(@"c:\users\colin\desktop\photos-test\");
// string[] files = Directory.GetFiles(@"c:\users\colin\pictures\photos\2023\07\14\"); // string[] files = Directory.GetFiles(@"c:\users\colin\pictures\photos\2023\07\14\");
// string[] files = Directory.GetFiles(@"G:\DCIM\100EOSR6\"); string[] files = Directory.GetFiles(@"G:\DCIM\100EOSR6\");
// string[] files = Directory.GetFiles(@"C:\Users\colin\Pictures\photos\2018\06\23"); // string[] files = Directory.GetFiles(@"C:\Users\colin\Pictures\photos\2018\06\23");
// string[] files = Directory.GetFiles(@"C:\Users\colin\Desktop\Germany all\104D7000"); // string[] files = Directory.GetFiles(@"C:\Users\colin\Desktop\Germany all\104D7000");
// string[] files = Directory.GetFiles(@"C:\Users\colin\Desktop\many-birds\"); // string[] files = Directory.GetFiles(@"C:\Users\colin\Desktop\many-birds\");