画像ファイルのヘッダーにコメントを追加したい。UserCommentでEXIFメタデータにコメントを追加できますが、画像ファイルのヘッダーに複数のコメントを追加したいと思います。
どのフレームワークを使用しますか?UserCommentには、ImageIOフレームワークを使用しています。
SwiftのJPEG画像にコメント(つまり、EXIF UserCommentではない)を追加する方法は次のとおりです。ImageIOフレームワークを使用してそれを行うことはできないと思います。
コードはwrjpgcom
、Cで記述されたコマンドラインツールから取得されます。これは、libjpegライブラリの一部です。詳細なコメントについては、ソースコードを確認してください(実際にはlibjpegを使用していません)。
SOFnの直前に新しいコメントマーカーを挿入します。これ(a)により、新しいコメントが既存のコメントの前ではなく後に表示されます。(b)JFIF仕様で要求されているように、コメントがJFIFまたはJFXXマーカーの後に来るようにします。
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)
(要点)
出力JPEGがこのWebサイトにアップロードされると、コメントが表示されます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加