2017-04-18 77 views
19

評論我要添加在圖像文件頭中的評論(縣)。由於我能夠在UserComment下添加對EXIF元數據的評論,但我想在圖像文件頭中添加多個評論。添加圖像文件頭

我該使用哪個框架?對於UserComment,我使用的是ImageIO框架。

+1

是的,你只需要使用UserComment在屬性,你可以添加字典的屬性,而不是像'{「註釋1」:「yourcomment」,「註釋2」:「yourcomment」}只是字符串' – iphonic

+0

@iphonic是的,我已經做到了這一點。這將在EXIF類型元數據中添加註釋,但我需要將其添加到元數據的文件類型中。請閱讀此鏈接http://s000.tinyupload.com/?file_id=00209075531742860207 –

+1

您是否嘗試過:'let url = URL(fileURLWithPath:「myfile.jpg」) var resourceValues = URLResourceValues() // TODO:設置一些值resourceValues url.setResourceValues(resourceValues)' – Ramis

回答

2

下面介紹如何在Swift中向JPEG圖像添加註釋(即而不是 EXIF UserComment)。我不認爲這可以使用ImageIO框架完成。

的代碼來自wrjpgcom命令行工具,寫在的libjpeg庫C.它的一部分。檢查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

謝謝你的回答。它的工作方式與我相同。 –