Переименование файла в VB.NET и переназначение / редактирование метаданных изображения / метатегов - PullRequest
3 голосов
/ 04 января 2011

Clarifiration:

Как мне отредактировать и сохранить EXIF ​​изображения / метаданные / FileInfo изображения без использования внешней DLL?

Проект:

Я создаю приложение для личного пользования, которое позволяет переименовывать, изменять метки и организовывать апокалиптическое количество изображений, размещаемых на моем личном веб-сайте. Так как я собирал забавные картинки и тому подобное в течение нескольких лет, нет никаких реальных рифм или причин для соглашений об именах файлов. Ergo, Image0001.jpg необходимо переименовать в описательное имя файла и заполнить поля метаданных.

Требуемый процесс примет существующий JPG, GIF, PNG, TIFF или BMP и сделает следующее:

  1. загрузить изображение в память
  2. конвертировать bmp файлы в jpgs, если необходимо (в основном для файлов меньшего размера)
  3. загрузка тегов изображения в структуру ImageData (см. Ниже)
  4. загрузка данных файла в структуру ImageData (где необходимо)
  5. отображение изображения и тегов для редактирования пользователем (в графическом окне и нескольких текстовых полях)
  6. разрешить редактирование полей и переименование файла
  7. записать изменения в файл изображения
  8. перейти к следующему файлу.

Пример:

  1. Загрузить изображение0001.jpg. Заполните поля структуры ImageData.
  2. Введите описание: "Lolcat потолок кот посылает сына".
  3. ImageData.FileName изменено на "lolcat-потолок-cat-send-son.jpg".
  4. ImageData.Name, .Keywords, .Title, .Subject и .Comments изменено на "lolcat потолок, кот отправляет сына".
  5. Сохранить файл с новым именем файла и сохранить все новые поля тегов.

(Позже я также буду использовать SQL для создания ссылочной базы данных со ссылками на онлайн-копии этих файлов, что позволит осуществлять поиск по ключевым словам, теме, имени файла и т. Д., Но это еще один слой, который намного проще, чем этот. По крайней мере, для меня.)

Проблема:

Пока что несколько дней исследований почти не дали ощутимого прогресса. Информация, по-видимому, была необъяснимым образом скрыта за кучей неожиданных поисковых ключевых слов, которые я не использовал для своих поисков. Любая помощь будет оценена.

Текущий код как:

Imports System.IO
Imports System.IO.Path
Imports System.Drawing.Imaging
Imports ImageData '(The Custom Structure below)'
'*Also has a project level reference to the dso.dll referenced below.'

Public Structure ImageData
        Shared FileAuthorAuthor As String
        Shared FileAuthorCategory As String
        Shared FileAuthorComments As String
        Shared FileAuthorCompany As String
        Shared FileAuthorDateCreated As DateTime
        Shared FileAuthorDescription As String
        Shared FileAuthorHeight As Decimal
        Shared FileAuthorHeightResolution As Decimal
        Shared FileAuthorImage As Image
        Shared FileAuthorKeywords As String
        Shared FileAuthorName As String
        Shared FileAuthorPath As String 'URL or IRL'
        Shared FileAuthorRead As Boolean
        Shared FileAuthorSubject As String
        Shared FileAuthorTitle As String
        Shared FileAuthorType As String
        Shared FileAuthorWidth As Decimal
        Shared FileAuthorWidthResolution As Decimal
End Structure 'ImageData

И текущий метод поиска данных:

Shared Function ReadExistingData(ByRef FileWithPath As String) As Boolean

        'Extract the FileName'
        Dim PathParts As String() = FileWithPath.Split("\") '"
        Dim FileName As String = PathParts(PathParts.Length - 1) 
        Dim FileParts As String() = FileName.Split(".")
        Dim FileType As String = FileParts(FileParts.Length - 1)

        'Create an Image object. '
        Dim SelectedImage As Bitmap = New Bitmap(FileWithPath)

        'Get the File Info from the Image.'
        Dim ImageFileInfo As New FileInfo(FileWithPath)
        Dim dso As DSOFile.OleDocumentProperties
        dso = New DSOFile.OleDocumentProperties
        dso.Open(FileWithPath.Trim, True, DSOFile.dsoFileOpenOptions.dsoOptionOpenReadOnlyIfNoWriteAccess)

        ImageData.FileAuthor = dso.SummaryProperties.Author '* Requires dso.DLL'
        ImageData.FileCategory = dso.SummaryProperties.Category '* Requires dso.DLL'
        ImageData.FileComments = dso.SummaryProperties.Comments '* Requires dso.DLL'
        ImageData.FileCompany = dso.SummaryProperties.Company '* Requires dso.DLL'
        ImageData.FileDateCreated = ImageFileInfo.CreationTime
        ImageData.FileDescription = dso.SummaryProperties.Comments  '* Requires dso.DLL.'
        ImageData.FileHeight = SelectedImage.Height
        ImageData.FileHeightResolution = SelectedImage.VerticalResolution
        ImageData.FileImage = New Bitmap(FileWithPath)
        ImageData.FileKeywords = dso.SummaryProperties.Keywords '* Requires dso.DLL'
        ImageData.FileName = FileName
        ImageData.FilePath = FileWithPath
        ImageData.FileRead = ImageFileInfo.IsReadOnly
        ImageData.FileSubject = dso.SummaryProperties.Subject '* Requires dso.DLL'
        ImageData.FileTitle = dso.SummaryProperties.Title '* Requires dso.DLL'
        ImageData.FileType = FileType
        ImageData.FileWidth = SelectedImage.Width
        ImageData.FileWidthResolution = SelectedImage.HorizontalResolution

        Return True

End Function 'ReadExistingData'

Я только что просмотрел несколько поисковых запросов "Top Box":

  • The dso.DLL: очень полезный, но нежелательный. Требуется внешняя DLL.
    [http://]www.developerfusion.com/code/5093/retrieving-the-summary-properties-of-a-file/

  • Неполные данные ~ Не отвечает на мои вопросы
    [http://]msdn.microsoft.com/en-us/library/xddt0dz7.aspx

  • Требуется внешняя DLL
    [http://]www.codeproject.com/KB/GDI-plus/ImageInfo.aspx

  • Требуется внешнее программное обеспечение
    [http://]stackoverflow.com/questions/3313474/write-metadata-to-png-image-in-net

  • Старые данные ~ Visual Studio 2005 и .NET 2.0
    [http://]www.codeproject.com/KB/graphics/MetaDataAccess.aspx

  • Конвертировать в BMP: Выглядит полезным
    [http://]www.freevbcode.com/ShowCode.Asp?ID=5799

Ответы [ 2 ]

1 голос
/ 04 января 2011

EDIT: Это не библиотека dll, вы просто копируете исходный код в свой проект и создаете новый экземпляр объекта.

Я использую класс с именем ExifWorks, найденный здесь: http://www.codeproject.com/KB/vb/exif_reader.aspx?msg=1813077 Он прост в использовании,

Dim EX As New ExifWorks(bitmap)
Dim dateStr As String = EX.DateTimeOriginal
Dim description As String = EX.Description
EX.SetPropertyString(ExifWorks.TagNames.ImageDescription, "my description")

Это самый простой способ, который я нашел до сих пор.Дайте мне знать, если у вас возникнут какие-либо проблемы.

0 голосов
/ 21 июля 2017
    Dim MyValue As String = ""

    For Each item In PictureBox1.Image.PropertyIdList
        MyValue = System.Text.Encoding.UTF8.GetString(PictureBox1.Image.GetPropertyItem(item).Value)
        ListBox1.Items.Add(MyValue)
    Next
...