dlemstra / dlemstra/Magick.NET
Update EXIF metadata without re-encoding JPEG image
- Dominant language
- C#
- Stars
- 4k
- Forks
- 451
- Avg merge
- 11h 55m
- Merged PRs (30d)
- 3
Description
I'm building an image processing app using .Net Core 3.0 and blazor. I'm using Magick.Net (latest version, Q16-AnyCPU, running on OSX and also on Linux) to read from and write to the IPTC tag list. I have two questions:
1. My code to add a tag looks something like this:
string tagToAdd = "New Tag";
// Read image from file
using (MagickImage image = new MagickImage(input))
{
// Retrieve the exif information
var profile = image.GetIptcProfile();
if( profile == null )
profile = new IptcProfile();
var keywords = profile.Values.Where(x => x.Tag == IptcTag.Keyword)
.Select( x => x.Value )
.ToList();
keywords.Add(tagToAdd);
string allKeywords = string.Join(",", keywords);
profile.SetValue(IptcTag.Keyword, allKeywords);
image.AddProfile(profile);
image.Write(output);
}
Is this the right approach? Is there a better way? There aren't really any good code samples for IPTC writing, so I wanted to check I've not missed an API to just add a single keyword to the existing set of keywords.
2. Assuming the code above is correct, is this guaranteed to be a no-op on the actual image itself? i.e., what I'm looking for is to just rewrite the IPTC Exif block without re-writing the image. What I _don't_ want this to do is re-encode the JPEG (or touch it at all) because obviously if it does that, after adding 10 keywords in separate operations I'll end up with blotchy artifacts in my images. I know that ExifTool does the tags addition/removal without touching the image data, but want to check if the same assumption for ImageMagick/Magick.Net.
The reason this question cropped up is because I had a 7.6MB image on disk, added a single keyword using the code above, and the resulting image was 6.8MB - which seems to me like it may have re-encoded the image and lost some data into the process. I could just spawn a process and run exiftool, but it's cleaner to do the IPTC tag changes in-process, particularly when the thing I'm writing is cross-platform.
Thanks for the help!
Contributor guide
Assessment
This issue has not been assessed yet.