【问题标题】:how to extract 'copyright status' from JPEG in C#如何在 C# 中从 JPEG 中提取“版权状态”
【发布时间】:2014-08-19 15:38:42
【问题描述】:

我创建了一个应用程序,它读取 JPEG 元数据并将其存储在数据库中,以便我们可以查看它是否有恶意字符。我可以使用以下代码提取元数据,但无法提取版权状态。有什么办法可以提取出来吗?

var stream = new FileStream(file, FileMode.Open, FileAccess.Read);
                        var decoder = new JpegBitmapDecoder(stream, BitmapCreateOptions.None, BitmapCacheOption.None);
                        var metadata = decoder.Frames[0].Metadata as BitmapMetadata;
                        if (metadata != null)
                        {
                            dataGridView1.Rows.Add(file,
                                metadata.ApplicationName,
                                metadata.Author != null ? metadata.Author.Aggregate((old, val) => old ?? "" + "; " + val) : "",
                                metadata.CameraManufacturer,
                                metadata.CameraModel,
                                metadata.Comment,
                                metadata.Copyright,
                                metadata.DateTaken,
                                metadata.Format,
                                metadata.Keywords != null ? metadata.Keywords.Aggregate((old, val) => old ?? "" + "; " + val) : "",
                                metadata.Location,
                                metadata.Rating,
                                metadata.Subject,
                                metadata.Title,
                                metadata.GetQuery("/xmp/photoshop:Instructions"),
                                metadata.GetQuery("/xmp/xmpRights:UsageTerms/x-default"),
                                metadata.GetQuery("/xmp/photoshop:Credit")
                                );
                        }

是否可以从代码中获取“版权状态”?这是在 Photoshop 中,我们可以在 Photoshop 中查看。

【问题讨论】:

  • 这与Copyright 属性有何不同?
  • Copyright 将拥有 ©Company 但状态有 3 个值 'Unknown'、'Copyrighted' 和 'public domain' controlledvocabulary.com/imagedatabases/…
  • This link 可能建议:metadata.GetQuery("/xmp/xmpRights:Marked");(来自一些谷歌搜索,false = 公共领域,true = 受版权保护,null = 未知)
  • 感谢它只给出我认为不正确的真或假。我想我需要比较 3 个版权状态不同的图像。
  • 我认为您必须手动读取 EXIF 数据才能做到这一点。在这种情况下,请参阅stackoverflow.com/questions/58649/…

标签: c# metadata jpeg photoshop xmp


【解决方案1】:

JPEG 没有定义版权字段。 Exif 文件格式支持版权。也许其他人也是如此。

如果您想要版权信息,您必须确定您是否有 Exif 文件。如果是这样,您必须在 SOI 标记之后查找 APP1 标记,确定它是否是 EXIF 标头,然后搜索嵌入在标记中的 TIFF 标头并查找版权标签。

【讨论】:

  • 谢谢,我尝试了很多工具来提取 Exif 数据,但无法提取版权状态,我认为它是 Photoshop 的专有财产?
  • 还有一种 Adob​​e JPEG 文件格式。这里有 Adob​​e 扩展块。你可以把一些版权文本放进去,看看 Photoshop 把它放在哪里。什么标记?
【解决方案2】:

我找到了方法,正如 Bridge 建议的那样,Marked 是关键。我向业务用户询问了 3 张图片,以下是我的发现

metadata.GetQuery("/xmp/xmpRights:Marked")  = ""      //for unknown
metadata.GetQuery("/xmp/xmpRights:Marked")  = "false" //for public domain 
metadata.GetQuery("/xmp/xmpRights:Marked")  = "true"  //for copyrighted

【讨论】:

  • 很高兴我能提供帮助 - 不妨将其标记为答案 :)
【解决方案3】:

我没有问题从 jpeg 中获取版权字段,只使用我找到的以下代码对 Shell32.dll 的引用:

    private void ListData()
    {
        List<string> arrHeaders = new List<string>();
        List<Tuple<int, string, string>> attributes = new List<Tuple<int, string, string>>();

        Shell32.Shell shell = new Shell32.Shell();
        var strFileName = filepath;
        Shell32.Folder objFolder = shell.NameSpace(System.IO.Path.GetDirectoryName(strFileName));
        Shell32.FolderItem folderItem = objFolder.ParseName(System.IO.Path.GetFileName(strFileName));


        for (int i = 0; i < short.MaxValue; i++)
        {
            string header = objFolder.GetDetailsOf(null, i);
            if (String.IsNullOrEmpty(header))
                break;
            arrHeaders.Add(header);
        }

        // The attributes list below will contain a tuple with attribute index, name and value
        // Once you know the index of the attribute you want to get, 
        // you can get it directly without looping, like this:
        var Authors = objFolder.GetDetailsOf(folderItem, 20);

        for (int i = 0; i < arrHeaders.Count; i++)
        {
            var attrName = arrHeaders[i];
            var attrValue = objFolder.GetDetailsOf(folderItem, i);
            var attrIdx = i;

            attributes.Add(new Tuple<int, string, string>(attrIdx, attrName, attrValue));

            data.Add(string.Format("'{0}'='{1}'", attrName, attrValue));
        }
        Console.ReadLine();
    }

在这里找到并稍作改动: How to read extended file properties / file metadata

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-21
    • 2013-10-02
    • 2011-02-23
    • 1970-01-01
    • 2020-03-18
    • 2020-11-08
    • 2012-02-03
    • 1970-01-01
    相关资源
    最近更新 更多