2017-04-18 8 views
19

이미지 파일 헤더에 주석을 추가하고 싶습니다. UserComment에서 EXIF ​​메타 데이터에 주석을 추가 할 수 있었지만 이미지 파일 헤더에 여러 개의 주석을 추가하려고합니다.이미지 파일 헤더에 덧글 추가

어떤 프레임 워크를 사용합니까? UserComment의 경우 ImageIO 프레임 워크를 사용하고 있습니다.

+1

예 만 USERCOMMENT 속성을 사용합니다, 당신은 추가 할 수 있습니다 사전에 '{ "comment1": "yourcomment", "comment2": "yourcomment"}' – iphonic

+0

@iphonic과 같은 문자열 대신 사전에 추가 할 수 있습니다. 이렇게하면 EXIF ​​형식 메타 데이터에 주석이 추가되지만 메타 데이터 파일 형식에 추가해야합니다. 이 링크를 읽으십시오. http://s000.tinyupload.com/?file_id=00209075531742860207 –

+1

다음을 시도해보십시오 :'let url = URL (fileURLWithPath : "myfile.jpg") var resourceValues ​​= URLResourceValues ​​() // TODO : some values ​​to resourceValues ​​ url.setResourceValues ​​(resourceValues) ' – Ramis

답변

2

Swift에서 JPEG 이미지에 댓글 (예 : 이 아닌 EXIF ​​사용자 댓글)을 추가하는 방법은 다음과 같습니다. 나는 그것이 ImageIO 프레임 워크를 사용하여 수행 할 수 있다고 생각하지 않습니다.

이 코드는 C로 작성된 wrjpgcom 명령 줄 도구에서 가져온 것입니다. libjpeg 라이브러리의 일부입니다. 더 자세한 설명은 source code을 확인하십시오 (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) 

(Gist) 출력 JPEG는 this 웹 사이트에 업로드 할 때

코멘트가 표시됩니다 :

enter image description here

+0

답변 해 주셔서 감사합니다. 그것은 내가 양상으로 일하고 있습니다. –