2012-01-03 103 views
6

CGImageDestinationRef蘋果引用它提到了It can contain thumbnail images as well as properties for each image.通過設置properties參數時,將屬性部分添加到CGImageDestinationRef,但我無法弄清楚如何添加縮略圖。添加/通過(exif)縮略圖到CGImageDestinationRef

我要添加的縮略圖(或直接從CGImageSourceRef傳遞)到CGImageDestinationRef,使得所得到的圖像被打開時與CGImageSourceRef我可以使用CGImageSourceCreateThumbnailAtIndex檢索原始縮略圖。

NSDictionary* thumbOpts = [NSDictionary dictionaryWithObjectsAndKeys: 
             (id)kCFBooleanTrue, (id)kCGImageSourceCreateThumbnailWithTransform, 
             (id)kCFBooleanFalse, (id)kCGImageSourceCreateThumbnailFromImageIfAbsent, 
             [NSNumber numberWithInt:128], (id)kCGImageSourceThumbnailMaxPixelSize, 
             nil]; 
CGImageRef thumb = CGImageSourceCreateThumbnailAtIndex(iSource, 0, (CFDictionaryRef)thumbOpts); 

上面的代碼返回它已存儲的圖像的縮略圖,但是當我通過CGImageDestinationRef傳遞圖像,縮略圖丟失。

有沒有辦法保留原始縮略圖(或創建一個新的)? CGImageProperties Reference似乎沒有任何鍵存儲縮略圖的位置。

回答

1

我發現獲取縮略圖的一種方法是在設置字典中指定kCGImageSourceCreateThumbnailFromImageIfAbsent。

指定字典如下

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

更新:爲二級(縮略圖)圖像添加到原CGImageDestinationRef做你添加的主要圖像

size_t thumbWidth = 640; 
size_t thumbHeight = imageHeight/(imageWidth/thumbWidth); 
size_t thumbBytesPerRow = thumbWidth * 4; 
size_t thumbTotalBytes = thumbBytesPerRow * thumbHeight; 
void *thumbData = malloc(thumbTotalBytes); 
CGContextRef thumbContext = CGBitmapContextCreate(thumbData, 
                thumbWidth, 
                thumbHeight, 
                8, 
                thumbBytesPerRow, 
                CGColorSpaceCreateDeviceRGB(), 
                kCGImageAlphaNoneSkipFirst); 

CGRect thumbRect = CGRectMake(0.f, 0.f, thumbWidth, thumbHeight); 
CGContextDrawImage(thumbContext, thumbRect, fullImage); 
CGImageRef thumbImage = CGBitmapContextCreateImage(thumbContext); 
CGContextRelease(thumbContext); 
CGImageDestinationAddImage(destination, thumbImage, nil); 
CGImageRelease(thumbImage); 

繼然後爲了得到縮略圖,請執行以下操作:

CFURLRef imageFileURLRef = (__bridge CFURLRef)url; 
NSDictionary* sourceOptions = @{(id)kCGImageSourceShouldCache: (id)kCFBooleanFalse, 
            (id)kCGImageSourceTypeIdentifierHint: (id)kUTTypeTIFF}; 
CFDictionaryRef sourceOptionsRef = (__bridge CFDictionaryRef)sourceOptions; 
CGImageSourceRef imageSource = CGImageSourceCreateWithURL(imageFileURLRef, sourceOptionsRef); 
CGImageRef thumb = CGImageSourceCreateImageAtIndex(imageSource, 1, sourceOptionsRef); 
UIImage *thumbImage = [[UIImage alloc] initWithCGImage:thumb]; 
CFRelease(imageSource); 
CGImageRelease(thumb); 
+0

這是非常多的我在問題中添加了相同的代碼,以獲取縮略圖。該問題詢問如何在CGImageDestinationRef中設置縮略圖。 – 2015-04-29 05:40:29

+0

CGImageSourceCreateThumbnailAtIndex的選項字典用於從CGImageDestination中獲取縮略圖。如果不存在縮略圖,則將kCGImageSourceCreateThumbnailFromImageIfAbsent設置爲kCFBooleanTrue會導致創建縮略圖。如果您正在嘗試向CGImageDestination添加縮略圖圖像,我的代碼片段和您在原始問題中發佈的代碼片段是無關緊要的。請參閱我的更新回答,瞭解如何添加縮略圖並檢索它。 – 2015-05-05 06:10:19

+0

這看起來像一個體面的解決方法。但是,這隻適用於從我自己的應用程序設置和加載縮略圖。其他應用程序很可能會嘗試獲取緩存的縮略圖,而不是從索引1讀取圖像。如果圖像容器包含多個圖像,這也可能導致其他問題。 – 2015-05-09 10:04:11

1

好的,因爲沒有人迴應(即使在賞金期間),加上我花了數小時試圖通過縮略圖,我的猜測是CGImageDestination的文檔是誤導性的。似乎沒有任何(記錄)的方式將圖像縮略圖傳遞到CGImageDestinationRef(至少不包括OSX 10.7.0和iOS 5.0)。

如果有人認爲不然,發表一個答案,我會接受它(如果它是正確的)。