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 中查看它。

版权状况

4

3 回答 3

1

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

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

于 2014-08-20T02:52:36.390 回答
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
于 2014-08-21T09:37:11.973 回答
0

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

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

于 2018-11-24T16:04:34.093 回答