2013-10-30 18 views
5

Tôi đang tạo ứng dụng chỉnh sửa ảnh và cho đến nay tôi đã quản lý để đọc siêu dữ liệu từ tệp hình ảnh thành công (sau khi nhận được câu trả lời cho câu hỏi này : Reading Camera data from EXIF while opening NSImage on OS X).Ghi siêu dữ liệu hình ảnh (EXIF/TIFF/IPTC) vào tệp hình ảnh trong OS X

source = CGImageSourceCreateWithURL((__bridge CFURLRef)url, NULL); 
NSDictionary *props = (__bridge_transfer NSDictionary *) CGImageSourceCopyPropertiesAtIndex(source, 0, NULL); 

Điều này sao chép tất cả siêu dữ liệu của tệp hình ảnh vào từ điển và hoạt động tốt. Tuy nhiên, tôi không thể tìm hiểu cách ghi siêu dữ liệu này trở lại một tệp mới được tạo ra NSImage (hoặc tệp hình ảnh). Dưới đây là cách tôi lưu tập tin của tôi (nơi img là một ví dụ NSImage mà không siêu dữ liệu và self.cachedMetadata được từ điển đọc từ hình ảnh ban đầu):

NSBitmapImageRep *rep = [NSBitmapImageRep imageRepWithData:[img TIFFRepresentation]]; 
[rep setProperty:NSImageEXIFData withValue:self.cachedMetadata]; 
NSData *data; 
if([[fileName lowercaseString] rangeOfString:@".png"].location != NSNotFound){ 
    data = [rep representationUsingType:NSPNGFileType properties:nil]; 
}else if([[fileName lowercaseString] rangeOfString:@".tif"].location != NSNotFound){ 
    data = [rep representationUsingType:NSTIFFFileType properties:nil]; 
}else{ //assume jpeg 
    data = [rep representationUsingType:NSJPEGFileType properties:@{NSImageCompressionFactor: [NSNumber numberWithFloat:1], NSImageEXIFData: self.cachedMetadata}]; 
} 

[data writeToFile:fileName atomically:YES]; 

Làm thế nào tôi có thể viết các siêu dữ liệu? Tôi đã từng viết EXIF ​​cho JPEG (từ điển chỉ EXIF ​​trước đó) nhưng vì EXIF ​​thiếu một số trường mà hình ảnh ban đầu có (thẻ IPTC và TIFF) tôi cần thay đổi phương thức đọc của mình. Bây giờ tôi có tất cả dữ liệu, nhưng tôi không biết cách ghi nó vào tệp hình ảnh mới được tạo ra.

Xin cảm ơn, Có thể.

+0

Xin chào! Tôi ít nhiều trong tình huống tương tự nhưng không thể hiểu được giải pháp của bạn. Tôi đã nắm bắt các từ khóa, titile và mô tả tôi phải viết vào phần IPTC của một jpg tôi biết con đường của. Điều này có thể giải quyết như thế nào? bạn có thể vui lòng xem câu hỏi này và có thể đăng câu trả lời không? http://stackoverflow.com/questions/23874865/write-iptc-data-to-file – user2452250

Trả lời

4

Tìm thấy một câu trả lời từ một câu hỏi StackOverflow: How do you overwrite image metadata?:

(mã lấy từ câu hỏi đó chính nó và sửa đổi cho nhu cầu của tôi, trong đó có câu trả lời cho câu hỏi của tôi)

//assuming I've already loaded the image source and read the meta 
CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef) data, NULL); 
CFStringRef imageType = CGImageSourceGetType(source); 

//new empty data to write the final image data to 
NSMutableData *resultData = [NSMutableData data]; 
CGImageDestinationRef imgDest = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)(resultData), imageType, 1, NULL); 

//copy image data 
CGImageDestinationAddImageFromSource(imgDest, source, 0, (__bridge CFDictionaryRef)(window.cachedMetadata)); 
BOOL success = CGImageDestinationFinalize(imgDest); 

này đã làm việc một cách hoàn hảo cho viết lại tất cả siêu dữ liệu bao gồm EXIF, TIFF và IPTC.

+0

làm điều này cũng bảo vệ đường cắt nếu có? – sharkyenergy

+0

@sharkyenergy thành thật mà nói tôi đã không thử nó. –

+0

Tôi đã mở một câu hỏi mới cho điều này ở đây: http://stackoverflow.com/questions/32160528/read-non-standard-properties-from-an-image-in-objective-c sẽ thêm tiền thưởng vào tối nay. Cũng có thể thú vị cho bạn nếu bạn có phần mềm tự chỉnh sửa ảnh. – sharkyenergy

0

Bạn có thể thử sử dụng hoặc xem mã trong công cụ "exiv2".

+0

Tôi có một dự án thương mại và giấy phép thương mại yêu cầu liên hệ với người sáng tạo. Tôi nên gắn bó với các giải pháp tích hợp sẵn. Có một cách để trích xuất tất cả dữ liệu đó hoàn toàn, cũng phải có cách viết lại tất cả dữ liệu đó vào hình ảnh. –

Các vấn đề liên quan