Displaying Image Properties

 

 

디지털 이미지에는 사진의 크기, 해상도, 방향, 색상 프로필, 조리개, 초점, 촬영날짜, 키워드, 제목 등의 유용한 정보들이 들어 있습니다. 이런 정보들은 사진을 조작하고 편집할 때, 매우 유용합니다. 물론 사용자가 데이터를 입력했을 때만 가능합니다. CGImageSourceCopyPropertiesAtIndex 함수에서 Image source 에 있는 모든 이미지 정보 속성들을 추출할 수 있도록 딕셔너리를 제공하긴 하지만, 추출하고 정보를 표시해 주기 위해서는 코드를 작성해야 합니다.


이번 섹션에서는 Mac OS X ImageApp 셈플코드를 통해서 좀 더 자세히 알아 볼 것입니다. 이미지 뷰이며, 다운로드 받으 실 수 있습니다. 이 ImageApp 예제의 핵심 내용 중 하나는 현재 표시중인 사진의 썸네일과 각종 속성들을 표시해 주는 기능입니다.

 

 

Figure 2-1 An Info window that displays image properties

 

이 패널의 상세한 구현은 ImageInfoPanel.h 와 ImageInfoPanel.m 에 모두 나와 있습니다. 그리고 윈도우와 바인딩이 어떻게 되어 있는지는 nlib 파일을 참고하면 됩니다. CGImageSource 함수를 가지고 이미지 편집 어플리케이션을 만들 수 있는지는 Listing 2-3 을 참고하시기 바랍니다. 코드에 각각 라인이 어떤 역할을 하는지에 대한 상세한 설명은 소스코드 아래에 나와 있습니다.(아래 소스만 여러분의 프로그램에 복사해서 넣는다고 정상적으로 동작하지는 않습니다. 아래 코드는 ImageApp 예제의 코드 일부 입니다.)

 

 

 

Listing 2-3 A routine that creates an image source and retrieves properties


- (void) setURL:(NSURL*)url 
{ 
    if ([url isEqual:mUrl]) 
        return; 

    [mUrl autorelease]; 
    mUrl = [url retain]; 

    CGImageSourceRef source = CGImageSourceCreateWithURL((CFURLRef)url, NULL); // 1 

    if (source) 
    { 
        NSDictionary* props = 
           (NSDictionary*) CGImageSourceCopyPropertiesAtIndex(source, 0, NULL); // 2 

        [mTree setContent:[self propTree:props]]; // 3 
        [props release]; 

        NSDictionary* thumbOpts = [NSDictionary dictionaryWithObjectsAndKeys: 
            (id)kCFBooleanTrue, (id)kCGImageSourceCreateThumbnailWithTransform, 
            (id)kCFBooleanTrue, (id)kCGImageSourceCreateThumbnailFromImageIfAbsent, 
            [NSNumber numberWithInt:128], (id)kCGImageSourceThumbnailMaxPixelSize, 
            nil]; // 4 

        CGImageRef image = CGImageSourceCreateThumbnailAtIndex(source, 0, 
                                      (CFDictionaryRef)thumbOpts); // 5 

        [mThumbView setImage:image]; // 6 
        CGImageRelease(image); // 7 
        [mFilePath setStringValue:[mUrl path]]; // 8 

        NSString* uti = (NSString*)CGImageSourceGetType(source); // 9 
        [mFileType setStringValue:[NSString stringWithFormat:@"%@\n%@", 
                        ImageIOLocalizedString(uti), uti]]; // 10 

        CFDictionaryRef fileProps = CGImageSourceCopyProperties(source, nil); // 11 
        [mFileSize setStringValue:[NSString stringWithFormat:@"%@ bytes", 
            (id)CFDictionaryGetValue(fileProps, kCGImagePropertyFileSize)]]; // 12 
    } 
    else  // 13 
    { 
        [mTree setContent:nil]; 
        [mThumbView setImage:nil]; 
        [mFilePath setStringValue:@""]; 
        [mFileType setStringValue:@""]; 
        [mFileSize setStringValue:@""]; 
    } 
} 


 

 

각 코드에 대한 설명:

  1. URL 로부터 image source 객체를 생성

  2. index 0 에 위치한 이미지의 속성들을 복사합니다. 몇몇 사진 파일 포맷들은 한개 이상의 이미지를 저장할 수 있습니다. 그렇지만 이 예제에서는 한 개의 이미지만 고려하겠습니다. CGImageSourceCopyPropertiesAtIndex 함수는 CFDictionary 객체를 리턴합니다. CFDictionary 객체를 NSDictionary 로 캐스팅 합니다.

    리턴된 딕셔너리에는 key-value 쌍으로 속성들이 들어 있습니다. 그러나 일부 값들은 속성을 가지고 있는 또 다른 딕셔너리입니다. Figure 2-1  를 보면, key-value 형태의 간단한 값(Color Model-RGB 처럼)들도 있지만, Exif 속성, IPTC 속성, JFIF 속성, TIFF 속성처럼 그렇지 않는 것들도 있습니다. 이런 것들은 딕셔너리로 되어 있습니다. 이런 딕셔너리 형태의 내부 값들을 살펴보려면, 화살표를 눌러 확장시키면 됩니다. 그러면 그 안에 각 속성들이 표시될 것입니다. 다음 과정에서 이 부분을 설명하도록 하겠습니다.

  3. 딕셔너리에서 속성들을 가져와 트리 컨트롤러에 입력합니다. ImageInfoPanel.h 파일을 보면, mTree 라는 변수를 볼 수 있는데, 이것은 Interface Builder 를 나타내는 NSTreeController 객체 입니다. 이 컨트롤러는 객체의 tree 를 관리합니다. 이 경우에 객체는 image 의 속성들이 됩니다.

    propTree: 메소드는 ImageInfoPanel.m 파일에 정의되어 있습니다. 이 메소드 목적은 앞 과정에서 추출해 낸 딕셔너리의 속성들을 탐색하고, 이미지 속성을 추출하고, NSTreeController 객체 안에 배열들을 만들어 넣는 것입니다.

  4. image source 로부터 image 를 만들 때, 사용할 옵션을 위한 딕셔너리를 만듭니다. 딕셔너리에 넣을 옵션들을 다시 잘 생각해 보십시오. Figure 2-1 에 있는 정보 패널에 썸네일 이미지가 표시됩니다. 이 코드에 있는 옵션 설정은 썸네일을 만들 때, 회전을 시키고, 방향에 과 전체 이미지 비율에 맞도록 크기를 조절합니다. 썸네일이 없는 경우에는 최대 픽셀을 128 x 128 픽셀로 하여, 새로 생성합니다.

  5. 위 단계에서 설정한 옵션을 가지고, image source 에 있는 첫번째 이미지의 썸네일을 생성합니다.

  6. 정보 패널에 있는 뷰에 썸네일을 표시합니다.

  7. 이미지 리소스를 해제합니다. 왜냐면 더 이상 필요가 없기 때문입니다.

  8. 메소드에 전달할 path 를 URL 로부터 뽑아 냅니다. 그리고 정보 패널에 입력할 텍스트 필드의 문자열을 지정합니다. 이게 바로 Figure 2-1 에 보이는 Path 부분입니다.

  9. image source 의 타입 식별자를 가져 옵니다.(이것은 source 에 있는 이미지 타입과 다를 수 있습니다.)

  10. 문자열을 UTI (ImageIOLocalizedString 은 ImagePanel.m 파일에 정의되어 있습니다.)를 위해 지역화(localized)된 문자열로 변경하기 위해 함수 호출을 합니다. 그리고나서 그 값을 정보 패널에 지정합니다. 이 부분이 Figure 2-1. 에 Type 부분입니다.

  11. image source 에 있는 속성들 딕셔너리를 추출합니다. 컨테이너에 이 속성들(예를들어 file size 같은)을 지정합니다. 참고로 이 속성들은 image source 에 있는 개별 이미지들의 속성이 아닙니다.

  12. 위 단계에서 구한 image source 딕셔너리로부터 파일 사이즈 값을 얻어, 정보 패널에 표시합니다. 이것이 Figure 2-1. 에 보이는 Size 부분입니다.

  13. 소스가 생성되지 않았을 경우, 그 사실을 화면에 표시하도록 합니다.

     

 

원본 : https://developer.apple.com/library/mac/#documentation/GraphicsImaging/Conceptual/ImageIOGuide/imageio_source/ikpg_source.html#//apple_ref/doc/uid/TP40005462-CH218-SW3