Ответ 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 загружается на этот веб-сайт: