1

我使用Magick.NET库来读取 exif 值。为了获得最高性能,我正在使用Ping方法(请参阅this),因为在处理某些图像元数据时我不需要实际的图像内容。

但是现在如果这个值不存在,我需要写 exif 标签值。我正在尝试做的事情:

    public static void Test()
    {
        var path = @"C:\image.jpg";

        using (var image = new MagickImage())
        {
            image.Ping(path);

            var profile = image.GetExifProfile();

            var copyright = profile.Values.FirstOrDefault(x => x.Tag == ExifTag.Copyright);
            if (copyright != null)
            {
                Trace.WriteLine("Copyright: " + copyright);
            }
            else
            {
                Trace.WriteLine("Write Copyright data");

                profile.SetValue(ExifTag.Copyright, "Example text");
                image.AddProfile(profile, true);
                image.Write(path);
            }
        }
    }

但是这段代码没有将标签值写入 exif。我可以在以另一种方式打开文件时成功写入标签值(如在此答案中):

        var path = @"C:\image.jpg";

        // Read image with content
        using (var image = new MagickImage(path))
        {
            // image.Ping(path) - no more need
            var profile = image.GetExifProfile();

            ...
        }

但是这个解码整个图像内容,我不需要它来改变“内容独立”标签的值,比如版权DateTimeDigitized

问题是:如何在不加载整个图像内容的情况下编辑这个 exif 标签? 我是否需要重写整个 exif 配置文件()或者有什么方法可以编辑配置文件?
image.AddProfile(profile, true)

4

1 回答 1

2

不幸的是,在 Magick.NET 中没有办法做到这一点。.Read如果要写入图像,则需要读取图像的所有像素。.Ping仅当您想从图像中获取信息而不加载整个图像时才应使用该方法。

无法仅替换/编辑一个值。您正在正确替换配置文件。您不需要,true因为这是 AddProfile 的默认值。

可能有另一个库可以帮助您解决这个问题。您还可以阅读 JPEG 规范并在文件中找到 EXIF 配置文件的位置。然后使用 ExifProfile 类对其进行修改并将其写回图像。我将把这部分作为练习留给读者。

这个功能也不太可能最终出现在 ImageMagick 中,因为这意味着我们将不得不重写我们编码和解码图像的方式。作为 Magick.NET 的维护者,我将来可以添加这个额外的功能。我已经编写了 ImageOptimizers,可用于减小不属于 ImageMagick 的 JPG/PNG 图像的大小。但我不能告诉你什么时候可以使用。

于 2016-04-07T21:15:44.157 回答