c#:检索JPEG注释(不是Exif)

本文关键字:不是 Exif 注释 检索 JPEG | 更新日期: 2023-09-27 18:08:00

我一直想弄清楚这个问题。

我试图通过c#从jpg文件中检索"Jpeg评论"。下面的代码工作,但我需要基本的注释,而不是Exif注释。我使用FastStone图像查看器来设置基本评论。帮我把它找回来。

我可以使用命令行程序exiv2来验证注释是否存在。Exiv2 -pc c:'test.jpg(它吐出基本的注释)。exiv2 - pac:'test.jpg(它吐出EXIF注释)我已经使用了几个c#库来获得它,但它们获得EXIF数据。

        Image x = Image.FromFile(@"c:'test.jpg");
        PropertyItem prop;
        prop = x.GetPropertyItem(0x9286);
        string Comment = Encoding.ASCII.GetString(prop.Value); 

c#:检索JPEG注释(不是Exif)

你可以参考这个链接。

(感谢那些已经回答了同样问题的人,虽然答案是完全正确的,但不是100%解决这个问题。)

以下是你需要做的三个步骤:
  1. 请注意,你应该克隆Jpeg文件。
  2. 设置克隆文件的注释
  3. 通过删除原始jpeg文件来替换文件
下面是示例代码:
    public void addImageComment(string imageFlePath, string comments)
    {
        BitmapDecoder decoder = null;
        BitmapFrame bitmapFrame = null;
        BitmapMetadata metadata = null;
        FileInfo originalImage = new FileInfo(imageFlePath);
        if (File.Exists(imageFlePath))
        {
            // load the jpg file with a JpegBitmapDecoder    
            using (Stream jpegStreamIn = File.Open(imageFlePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
            {
                decoder = new JpegBitmapDecoder(jpegStreamIn, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
            }
            bitmapFrame = decoder.Frames[0];
            metadata = (BitmapMetadata)bitmapFrame.Metadata;
            if (bitmapFrame != null)
            {
                BitmapMetadata metaData = (BitmapMetadata)bitmapFrame.Metadata.Clone();
                if (metaData != null)
                {
                    // modify the metadata   
                    metaData.Comment = comments;
                    // get an encoder to create a new jpg file with the new metadata.      
                    JpegBitmapEncoder encoder = new JpegBitmapEncoder();
                    encoder.Frames.Add(BitmapFrame.Create(bitmapFrame, bitmapFrame.Thumbnail, metaData, bitmapFrame.ColorContexts));
                    //string jpegNewFileName = Path.Combine(jpegDirectory, "JpegTemp.jpg");
                    // Delete the original
                    originalImage.Delete();
                    // Save the new image 
                    using (Stream jpegStreamOut = File.Open(imageFlePath, FileMode.CreateNew, FileAccess.ReadWrite))
                    {
                        encoder.Save(jpegStreamOut);
                    }
                }
            }
        }
    }

使用MetadataExtractor库(可通过NuGet获得)可以很简单地做到这一点:

JpegCommentDirectory jpegCommentDirectory = ImageMetadataReader.ReadMetadata(imagePath)
     .OfType<JpegCommentDirectory>()
     .FirstOrDefault();
string comment = jpegCommentDirectory?.GetDescription(JpegCommentDirectory.TagComment);