Подтвердить что ты не робот

Добавить комментарий к заголовку файла изображения

Я хочу добавить комментарий в заголовок файла изображения. Поскольку я могу добавить комментарий к метафайлам EXIF ​​в UserComment, но я хочу добавить несколько комментариев в заголовок файла изображения.

Какую структуру я использую? Для UserComment я использую среду ImageIO.

4b9b3361

Ответ 1

Здесь как добавить комментарий (т.е. не EXIM UserComment) к изображению JPEG в Swift. Я не думаю, что это можно сделать с помощью среды ImageIO.

Код исходит из инструмента командной строки wrjpgcom, написанного на C. Это часть библиотеки libjpeg. Подробнее читайте исходный код для более подробных комментариев (на самом деле он не использует libjpeg).

Мы добавим новый маркер комментария непосредственно перед SOFn. Это (a) заставляет новый комментарий появляться после, а не ранее, существующих комментариев; и ( b) гарантирует, что комментарии появятся после любых маркеров JFIF или JFXX, как того требует спецификация JFIF.

import Foundation

func addJPEGComment(to jpegData: inout Data, _ comment: String) {

    // find index of first SOF marker, or EOI
    let sofMarkers: [UInt8] = [
        0xC0, 0xC1, 0xC2, 0xC3, 0xC5, 0xC6,
        0xC7, 0xC9, 0xCA, 0xCB, 0xCD, 0xCE,
        0xCF, 0xD9 // EOI
    ]

    var firstSOFRange: Range<Data.Index>?
    for marker in sofMarkers {
        if let range = jpegData.range(of: Data(bytes: [ 0xFF, marker ])) {
            firstSOFRange = range
            break
        }
    }

    guard let firstSOFIndex = firstSOFRange?.lowerBound
        else { fatalError("No SOF or EOI marker found.") }

    // create comment byte array
    let length = comment.lengthOfBytes(using: .utf8) + 2
    let l1 = UInt8((length >> 8) & 0xFF)
    let l2 = UInt8(length & 0xFF)
    let commentArray = [ 0xFF, 0xFE /* COM marker */, l1, l2 ] + [UInt8](comment.utf8)

    // insert comment array into image data object
    jpegData.insert(contentsOf: commentArray, at: firstSOFIndex)
}

guard let jpegURL = Bundle.main.url(forResource: "no_com", withExtension: "jpg")
    else { fatalError("File not found.") }

guard var jpegData = try? Data(contentsOf: jpegURL)
    else { fatalError("File could not be read.") }

addJPEGComment(to: &jpegData, "This is a JPEG comment.")

guard let jpegOutputURL = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("with_com.jpg")
    else { fatalError("Destination URL not created") }

try jpegData.write(to: jpegOutputURL)

print(jpegOutputURL)

(Gist)

Комментарий отображается, когда выходной JPEG загружается на этот веб-сайт:

введите описание изображения здесь