Creating and Using Image Sources

 

 

Image Source 는 데이터 엑세스 작업을 추상화 시키고, 여러분들이 메모리 버퍼에서 데이터를 관리하는게 편하도록 해 줍니다. Image Source 에는 이미지 정보 한개만 들어있는게 아닙니다. 썸네일 이미지들, 각각의 이미지에 대한 속성값들, 그리고 이미지 파일들을 포함 할 수 있습니다. 여러분들이 Mac OS X v10.4 이후 버젼에서 이미지 데이터를 가지고 작업을 한다면, 어플리케이션 안에 이미지 데이터를 옮기는 방법이 선호됩니다.  CGImageSource  객체를 만들면, CGImageSource Reference. 에 설명되어있는 함수들을 이용하여 이미지들, 썸네일들을 뽑아 낼 수 있고, 이미지 속성  그리고 다른 이미지의 정보들을 얻을 수 있습니다.

 

 

 

Creating an Image from an Image Source  

 

 

일반적으로 여러분들이 이미지 입출력 프레임워크를 통해서 하려는 일은 Listing 2-1 에 있는 것처럼, Image Source 를 가지고 이미지를 만드는 일일 것입니다. 이 예제에서는 파일명을 가지고 어떻게 Image Source를 만들고, 이미지를 추출하는지 보여줍니다. 여러분이 Image Source 객체를 만들때, 이미지 소스 파일을 어떤 포맷으로 할 건지와 같은 힌트를 제공해 줄 수 있습니다.

 

Image Source를 가지고 이미지를 만들 때, index 를 반드시 지정해야 합니다. 그리고 썸네일을 생성 할 것인지, 또는 캐싱을 허용 할 건지와 같은 속성들을 딕셔너리 형태로 지정 할 수 있습니다. 사용 가능한 key 와 value 들은 CGImageSource Reference and CGImageProperties Reference 에 나와 있습니다.

 

어떤 이미지들은 동일한 소스파일에 여러개의 이미지를 저장하기 때문에, index 값을 반드시 지정해야 합니다. 한 개의 이미지만 가지고 있는 이미지 소스파일은 index를 0 으로 설정합니다. CGImageSourceGetCount 함수를 사용하면, 이미지 소스파일에 몇 장의 이미지가 들어 있는지 확인 할 수 있습니다.

 

 

Listing 2-1 Creating an image from an image source


CGImageRef MyCreateCGImageFromFile (NSString* path) 
{ 
    // Get the URL for the pathname passed to the function. 
    NSURL             url = [NSURL fileURLWithPath:path]; 
    CGImageRef        myImage = NULL; 
    CGImageSourceRef  myImageSource; 
    CFDictionaryRef   myOptions = NULL; 
    CFStringRef       myKeys[2]; 
    CFTypeRef         myValues[2]; 

    // Set up options if you want them. The options here are for 
    // caching the image in a decoded form and for using floating-point 
    // values if the image format supports them. 
    myKeys[0] = kCGImageSourceShouldCache; 
    myValues[0] = (CFTypeRef)kCFBooleanTrue; 
    myKeys[1] = kCGImageSourceShouldAllowFloat; 
    myValues[1] = (CFTypeRef)kCFBooleanTrue; 

    // Create the dictionary 
    myOptions = CFDictionaryCreate(NULL, (const void **) myKeys, 
                   (const void **) myValues, 2, 
                   &kCFTypeDictionaryKeyCallBacks, 
                   & kCFTypeDictionaryValueCallBacks); 

    // Create an image source from the URL. 
    myImageSource = CGImageSourceCreateWithURL((CFURLRef)url, myOptions); 
    CFRelease(myOptions); 

    // Make sure the image source exists before continuing 
    if (myImageSource == NULL){ 
        fprintf(stderr, "Image source is NULL."); 
        return  NULL; 
    } 

    // Create an image from the first item in the image source. 
    myImage = CGImageSourceCreateImageAtIndex(myImageSource, 0, NULL); 
    CFRelease(myImageSource); 

    // Make sure the image exists before continuing 
    if (myImage == NULL){ 
         fprintf(stderr, "Image not created from image source."); 
         return NULL; 
    } 

    return myImage; 
} 




 

 

 

 

Creating a Thumbnail Image from an Image Source


 

 

어떤 이미지 소스 파일들은 썸네일 이미지를 가지고 있습니다. Image I/O 에서는 썸네일이 없는 경우, 썸네일을 생성할 것인지 옵션을 제공합니다. 또한 썸네일 이미지의 크기변형을 허용 할 건지와 썸네일의 최대 사이즈를 지정할 수 있습니다.

 

Listing 2-2 에서는 데이터로부터 이미지 소스를 생성하는 방법을 보여줍니다. 그리고 썸네일과 관련된 옵션, 썸네일 이미지를 만들건지에 대한 옵션들을 설정하는 딕셔너리를 만드는 방법도 보여줍니다. 썸네일 이미지를 만들때 회전시킬지, 크기를 방향에 맞출 것인지, 원본 이미지의 픽셀 비율을 어떻게 할건지 등의 설정을 위한 키값은 kCGImageSourceCreateThumbnailWithTransform  에서 확인 하시면 됩니다.

 

 

Listing 2-2 Creating a thumbnail image


CGImageRef MyCreateThumbnailImageFromData (NSData * data, int imageSize) 
{ 
    CGImageRef        myThumbnailImage = NULL;
    CGImageSourceRef  myImageSource; 
    CFDictionaryRef   myOptions = NULL; 
    CFStringRef       myKeys[3]; 
    CFTypeRef         myValues[3]; 
    CFNumberRef       thumbnailSize; 

   // Create an image source from NSData; no options. 
   myImageSource = CGImageSourceCreateWithData((CFDataRef)data, 
                                               NULL); 

   // Make sure the image source exists before continuing. 
   if (myImageSource == NULL){ 
        fprintf(stderr, "Image source is NULL."); 
        return  NULL; 
   } 

   // Package the integer as a  CFNumber object. Using CFTypes allows you 
   // to more easily create the options dictionary later. 
   thumbnailSize = CFNumberCreate(NULL, kCFNumberIntType, &imageSize); 

   // Set up the thumbnail options. 
   myKeys[0] = kCGImageSourceCreateThumbnailWithTransform; 
   myValues[0] = (CFTypeRef)kCFBooleanTrue; 
   myKeys[1] = kCGImageSourceCreateThumbnailFromImageIfAbsent; 
   myValues[1] = (CFTypeRef)kCFBooleanTrue; 
   myKeys[2] = kCGImageSourceThumbnailMaxPixelSize; 
   myValues[2] = (CFTypeRef)thumbnailSize; 

   myOptions = CFDictionaryCreate(NULL, (const void **) myKeys, 
                   (const void **) myValues, 2, 
                   &kCFTypeDictionaryKeyCallBacks, 
                   & kCFTypeDictionaryValueCallBacks); 

  // Create the thumbnail image using the specified options. 
  myThumbnailImage = CGImageSourceCreateThumbnailAtIndex(myImageSource, 
                                          0, 
                                          myOptions); 
  // Release the options dictionary and the image source 
  // when you no longer need them. 
  CFRelease(thumbnailSize); 
  CFRelease(myOptions); 
  CFRelease(myImageSource); 

   // Make sure the thumbnail image exists before continuing. 
   if (myThumbnailImage == NULL){ 
         fprintf(stderr, "Thumbnail image not created from image source."); 
         return NULL; 
   } 

   return myThumbnailImage; 
} 




 

 

 

 

원본 :

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