Как добавить 'комментарии' к файлу JPEG Используя C#

Brad Abrams конкретно предостерегает от Enum.IsDefined в его сообщении Опасность Упрощения .

лучший способ избавиться от этого требования (то есть, потребность проверить перечисления) состоит в том, чтобы удалить пути, где пользователи могут понять его превратно, например, какое-то поле ввода. Используйте перечисления с холмами отбрасывания, например, для осуществления только допустимых перечислений.

18
задан John P 18 November 2009 в 10:51
поделиться

2 ответа

Следующий код решает мою проблему и добавляет комментарии к заданному изображению 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.

Имейте в виду, что для выполнения этой работы вам необходимо добавить ссылки .NET на PresentationCore и WindowsBase . При использовании Visual Studio 2008 это может быть достигнуто следующим образом:

  1. Щелкните правой кнопкой мыши свой проект в обозревателе решений

  2. В раскрывающемся списке выберите «Добавить ссылку ...»

  3. В новом поле В открывшемся окне выберите вкладку «.NET».

  4. Прокрутите до двух упомянутых выше ссылок и для каждой нажмите «ОК».

Большое спасибо danbystrom и Konamiman за вашу помощь в этом вопросе. Я очень ценю быстрый ответ.

12
ответ дан 30 November 2019 в 07:50
поделиться

Простая часть:

Добавьте этот элемент свойства:

var data = System.Text.Encoding.UTF8.GetBytes( "Some comments" );
PropertyItem pi;
*** create an empty PropertyItem here
pi.Type = 2;
pi.Id = 37510;
pi.Len = data.Length;
pi.Value = data;

В коллекцию PropertItems изображения.

Несколько более громоздкая часть: Как создать новый PropertyItem, если у него нет общедоступного конструктора?

Распространенный «трюк» состоит в том, чтобы иметь пустое изображение, из которого вы можете украсть PropertyItem. вздох

2
ответ дан 30 November 2019 в 07:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: