Как можно добавить дополнительные сведения к изображению, такие как автор, описание и ключевые слова?

Коллеги, привет! У меня возникла задача: мне необходимо добавить метаинформацию, например, заголовки exif, в изображение в виде слайса байт. Я изучил библиотеки на Go и обнаружил, что большинство из них предоставляют возможность считывать метаинформацию из файла, но не позволяют записывать её. Если кто-то сталкивался с подобным, подскажите, пожалуйста, библиотеку, которая позволяет это сделать. Буду благодарен за помощь.
  • 6 февраля 2024 г. 14:39
Ответы на вопрос 2
Привет! Для работы с метаданными изображений в Go вам может подойти библиотека `go-xmp`. XMP (Extensible Metadata Platform) — это стандарт Adobe для создания и обработки стандартных и специализированных метаданных. Данная библиотека поддерживает обработку XMP метаданных, которые могут включать автора, описание, ключевые слова и многие другие сведения.

Также вы можете использовать библиотеку `exif`. В то время как она используется в основном для чтения данных EXIF, есть поддержка и для записи некоторой информации. Например, вы можете изменить теги, связанные с датой снимка, ориентацией и другими стандартизированными метаданными EXIF.

Пример использования `exif` для изменения метаданных:

```go
package main

import (
    "log"
    "github.com/rwcarlsen/goexif/exif"
    "github.com/rwcarlsen/goexif/tiff"
    "os"
)

func main() {
    // Открытие файла изображения
    fname := "test.jpg"
    file, err := os.Open(fname)
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

    // Декодирование EXIF данных
    x, err := exif.Decode(file)
    if err != nil {
        log.Fatal(err)
    }

    // Сохранение новых данных
    tagName := "ImageDescription" // Тег, куда запишем описание
    if err := x.SetTag(exif.NewTag(tagName)); err != nil {
        log.Fatal(err)
    }
    
    // Здесь можно добавить много разных тегов. Например, добавим автора
    _ = x.Walk(func(name exif.FieldName, tag *tiff.Tag) error {
        if name == "Artist" {
            tag.SetString("<Имя автора>")
        }
        return nil
    })

    // Сохранение изображения с изменениями
    // В Go нет встроенных способов напрямую вставить данные EXIF обратно в JPG,
    // поэтому возможно, вам придется использовать другие инструменты или библиотеки
    // для вставки и сохранения обратно в файл.
}
```

Обратите внимание, что сценарий чтения и записи EXIF данных может быть ограничен встроенными возможностями библиотеки и битовым представлением изображения. На момент написания этого ответа, библиотека `goexif` может не поддерживать некоторые сценарии записи.

Если библиотеки не позволяют делать необходимую запись напрямую, возможный обходной путь — манипулировать байтами JPG или PNG файла вручную. Но такой подход более сложный и требует детального понимания строения форматов изображений и их метаданных.
https://github.com/dsoprea/go-exif 

Есть такая библиотека, которая умеет править или создавать новые exif-блоки
Похожие вопросы