C#:检索JPEG评论(不是Exif)

时间:2011-09-09 15:04:32

标签: c#

我一直难以想象这个。

我正试图通过C#从jpg文件中检索“Jpeg Comment”。 下面的代码有效,但我需要基本的评论而不是Exif评论。 我正在使用FastStone Image Viewer来设置基本注释。帮我找回来。

我可以使用命令行程序exiv2来验证评论是否存在。 exiv2 -pc c:\ test.jpg(它吐出基本评论)。 exiv2 -pa c:\ test.jpg(它吐出EXIF评论) 我已经使用了几个C#libs来获取它,但是它们获得了EXIF数据。

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

2 个答案:

答案 0 :(得分:0)

您可以参考此link

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

您需要执行以下三个步骤:

  1. 请注意,您应该克隆Jpeg文件。
  2. 设置克隆文件的注释。
  3. 删除原始jpeg文件替换文件。
  4. 以下是示例代码:

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

答案 1 :(得分:0)

您可以使用MetadataExtractor库(通过NuGet提供)非常简单地完成此操作:

JpegCommentDirectory jpegCommentDirectory = ImageMetadataReader.ReadMetadata(imagePath)
     .OfType<JpegCommentDirectory>()
     .FirstOrDefault();

string comment = jpegCommentDirectory?.GetDescription(JpegCommentDirectory.TagComment);