将标记值添加到图像中现有的exif配置文件中



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

但是现在我需要写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();
            ...
        }

但这种解码整个图像内容,我不需要它来更改"内容独立"标签的值,如版权DateTimeDigitalized

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新