在CGImageDestinationRef Apple的参考文献中,它提到It can contain thumbnail images as well as properties for each image.
通过在向properties
添加图片时设置CGImageDestinationRef
参数,具有属性的部分效果很好,但我无法弄清楚如何添加缩略图。
我想添加缩略图(或直接从CGImageSourceRef
传递)到CGImageDestinationRef
,这样当使用CGImageSourceRef
打开生成的图像时,我可以使用{{1}检索原始缩略图。
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);
传递图像时,缩略图会丢失。
有没有办法保留原始缩略图(或创建一个新缩略图)? CGImageProperties Reference似乎没有任何关键字来存储缩略图。
答案 0 :(得分:1)
好的,所以既然没有人回复(即使在赏金期间),加上我花了几个小时试图传递缩略图,我的猜测是CGImageDestination的文档是误导性的。似乎没有任何(记录)方法将图像缩略图传递给CGImageDestinationRef
(至少不包括OSX 10.7.0和iOS 5.0)。
如果有人不这么认为,请回复一下,我会接受(如果是正确的话)。
答案 1 :(得分: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);
答案 2 :(得分:0)
在iOS 8.0+上嵌入EXIF缩略图有一半记录的属性:kCGImageDestinationEmbedThumbnail。
Apple的开发者文档为空,但是头文件(CGImageDestination.h
)包含以下注释:
/* Enable or disable thumbnail embedding for JPEG and HEIF.
* The value should be kCFBooleanTrue or kCFBooleanFalse. Defaults to kCFBooleanFalse */
IMAGEIO_EXTERN const CFStringRef kCGImageDestinationEmbedThumbnail IMAGEIO_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0);
但是,您无法指定任意缩略图数据,它会自动为您创建。