一尘不染

如何使用C#将“注释”添加到JPEG文件

c#

在JPEG图像的属性窗口中,有一个名为“摘要”的选项卡。在此选项卡中,有一个名为“
Comments”的字段,我想编写一些c#代码,该代码会将给定的字符串添加到该字段,例如“ This is a photo”。

那里有些善良的灵魂知道该怎么做吗?

非常感谢。


阅读 316

收藏
2020-05-19

共1个答案

一尘不染

以下代码解决了我的问题,并在给定的JPEG图像中添加了注释:

public void addImageComment(string imageFlePath, string comments)
    {
        string jpegDirectory = Path.GetDirectoryName(imageFlePath);
        string jpegFileName = Path.GetFileNameWithoutExtension(imageFlePath);

        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.SetQuery("/app1/ifd/exif:{uint=40092}", 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);
                    }
                }
            }
        }
    }

这实际上是Konamiman友善提供的链接下找到的代码的轻度修改版本。

请注意,要进行此工作,您需要向 PresentationCoreWindowsBase 添加.NET引用。如果使用Visual Studio
2008,则可以通过以下方式实现:

  1. 在解决方案资源管理器中右键单击您的项目

  2. 从下拉列表中,选择添加“参考…”。

  3. 在打开的新框中,选择“ .NET”选项卡

  4. 滚动到上面提到的两个参考,然后在每个参考上单击“确定”。

非常感谢danbystrom和Konamiman在这件事上的帮助。我非常感谢您的快速回应。

2020-05-19