2014-07-16 1 views
3

dpi를 기본값 72가 아닌 다른 값으로 설정하기 위해 이미지의 메타 데이터를 변경할 수 있다는 것을 읽었습니다. this question 그러나 그 질문의 저자와 같은 문제가있었습니다. 원본 이미지의 이미지 메타 데이터 속성이 수정 사항보다 우선하는 것 같습니다.목표 c 프로그래밍 방식으로 JPEG 파일을 저장할 때 UIImage DPI를 설정하는 방법

내 아이폰의 사진 라이브러리에 이미지를 쓰려면 ALAssetsLibrary를 사용하고 있습니다. 표준 72dpi 대신 dpi가 500이어야합니다. 직접 비트 (as shown here)를 조작하여 속성을 변경할 수 있지만 iOS가 더 나은 솔루션을 제공하기를 바랍니다.

도움을 주셔서 감사합니다.

답변

7

이미지 메타 데이터 조작을위한이 코드 조각이 있고이 코드를 사용하여 이미지 메타 데이터의 값을 변경할 수 있습니다. 메타 데이터의 DPI 값을 변경해도 실제로 이미지가 처리되지 않고 DPI가 변경된다는 점에 유의하십시오.

#import <ImageIO/ImageIO.h> 


-(NSData *)changeMetaDataInImage 
{ 
    NSData *sourceImageData = [[NSData alloc] initWithContentsOfFile:@"~/Desktop/1.jpg"]; 
    if (sourceImageData != nil) 
    { 
     CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)sourceImageData, NULL); 

     NSDictionary *metadata = (__bridge_transfer NSDictionary *)CGImageSourceCopyPropertiesAtIndex(source, 0, NULL); 

     NSMutableDictionary *tempMetadata = [metadata mutableCopy]; 
     [tempMetadata setObject:[NSNumber numberWithInt:300] forKey:@"DPIHeight"]; 
     [tempMetadata setObject:[NSNumber numberWithInt:300] forKey:@"DPIWidth"]; 

     NSMutableDictionary *EXIFDictionary = [[tempMetadata objectForKey:(NSString *)kCGImagePropertyTIFFDictionary] mutableCopy]; 
     [EXIFDictionary setObject:[NSNumber numberWithInt:300] forKey:(NSString *)kCGImagePropertyTIFFXResolution]; 
     [EXIFDictionary setObject:[NSNumber numberWithInt:300] forKey:(NSString *)kCGImagePropertyTIFFYResolution]; 

     NSMutableDictionary *JFIFDictionary = [[NSMutableDictionary alloc] init]; 
     [JFIFDictionary setObject:[NSNumber numberWithInt:300] forKey:(NSString *)kCGImagePropertyJFIFXDensity]; 
     [JFIFDictionary setObject:[NSNumber numberWithInt:300] forKey:(NSString *)kCGImagePropertyJFIFYDensity]; 
     [JFIFDictionary setObject:@"1" forKey:(NSString *)kCGImagePropertyJFIFVersion]; 

     [tempMetadata setObject:EXIFDictionary forKey:(NSString *)kCGImagePropertyTIFFDictionary]; 
     [tempMetadata setObject:JFIFDictionary forKey:(NSString *)kCGImagePropertyJFIFDictionary]; 

     NSMutableData *destinationImageData = [NSMutableData data]; 

     CFStringRef UTI = CGImageSourceGetType(source); 

     CGImageDestinationRef destination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)destinationImageData, UTI, 1, NULL); 

     CGImageDestinationAddImageFromSource(destination, source,0, (__bridge CFDictionaryRef) tempMetadata); 

     CGImageDestinationFinalize(destination); 

     return destinationImageData; 
    } 
} 
+0

하나는 가지 더 .... 어떻게이를 반환 할 수 있습니다 : 예를 들어,

1 = No absolute unit of measurement. Used for images that may have a non-square aspect ratio, but no meaningful absolute dimensions. 2 = Inch. 3 = Centimeter.

2-ResolutionUnit는 DPI를 위해 (인치당 도트)가 필요합니다 설정의 세 가지 값을 가질 수 있습니다 파일에 쓰지 않고 NSData를 변경 했습니까? – Patricia

+1

답변을 편집했습니다. – mohacs

+1

흥미 롭습니다. 포토샵으로 저장된 이미지를 테스트하고 컴퓨터에서 미리보기를 해봤습니다. DPI는 저에게 잘 보입니다. – mohacs

2

JPEG를 내보내는 데이 솔루션을 사용하려고 시도하면서 Photoshop이 DPI를 내보낼 때 명예를주지 않음을 발견했습니다. Photoshop은 JFIF 헤더 정보를 적극적으로 무시합니다 (JPEG을 기록 할 때 실제로 자체를 내 보내지도 않음).

전 JFIF 섹션을 완전히 버렸습니다. 대부분의 현대 이미지 라이브러리는 TIFF/EXIF ​​데이터를 먼저보고 있으므로이를 포함하여 잘 작동하는 것처럼 보입니다. 귀하의 마일리지는 다를 수 있으므로 최대한 많은 수출 목적지를 테스트하십시오!

그러나 TIFF 데이터에는 ResolutionUnit 태그가 없습니다.이 태그가 없으면 Photoshop에서는 XResolutionYResolution을 무시합니다.

[EXIFDictionary setObject:@(2) forKey:(NSString *)kCGImagePropertyTIFFResolutionUnit]; 
관련 문제