将标记值添加到图像

时间:2016-04-06 08:28:15

标签: c# imagemagick exif magick.net

我使用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。我可以在以另一种方式打开文件时成功写入标记值(例如在此answer中):

        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))或者有一些方法可以编辑配置文件?

1 个答案:

答案 0 :(得分:2)

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

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

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

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