如何在C#中从JPEG文件中提取“版权状态”

3
我创建了一个应用程序,可以读取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中查看。

版权状态


这与“版权”属性有何不同? - Peter Ritchie
版权归©公司所有,但状态有三个值:“未知”,“受版权保护”和“公共领域”。http://www.controlledvocabulary.com/imagedatabases/is-copyright-status-important.html - Kamran Pervaiz
1
这个链接建议使用 metadata.GetQuery("/xmp/xmpRights:Marked"); (从一些谷歌搜索中得知,false = 公共领域,true = 版权所有,null = 未知)来解决一些图像(JPEG)添加帧时出现的元数据类型意外的问题。 - Bridge
感谢您的回复,但它只返回了true或false,我认为这是不正确的。我认为我需要比较三张版权状态不同的图片。 - Kamran Pervaiz
我认为你需要手动读取EXIF数据才能获得它。如果是这种情况,请参见https://dev59.com/n3VD5IYBdhLWcg3wL4iM - Peter Ritchie
谢谢,桥,请发布它,我会将您的答案标记为已解决。 - Kamran Pervaiz
3个回答

1
JPEG没有定义版权字段。Exif文件格式支持版权信息,可能还有其他格式也支持。如果需要版权信息,您需要确定是否有Exif文件。如果是,则需要在SOI标记后查找APP1标记,确定它是否为EXIF头,然后搜索嵌入标记中的TIFF头并查找版权标记。

谢谢,我已经尝试了许多工具来提取Exif数据,但无法提取版权状态,我认为这是Photoshop的专有属性? - Kamran Pervaiz
还有一种Adobe JPEG文件格式。还有Adobe扩展块。您可以放置一些版权文本,看看Photoshop将其放在哪里。什么标记? - user3344003

1
我已经找到了方法,就像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

1
很高兴我能帮到你 - 不妨把这个标记为答案 :) - Bridge

0

我使用一个对Shell32.dll的引用,通过以下代码从jpeg中获取版权字段没有遇到任何问题:

    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();
    }

在这里找到并稍作修改: 如何读取扩展文件属性/文件元数据

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接