如何从HEIF编码图像文件创建CGImage?
从HEIF文件创建CGImage的方法
Core Graphics确实没有提供直接的CGImageCreateWithHEIFDataProvider这类方法,但可以借助ImageIO框架来处理HEIF格式的图像,它支持HEIF解码,还能兼容你原来处理JPEG/PNG的逻辑思路。
方法一:通过文件URL创建CGImage
先导入ImageIO框架:
#import <ImageIO/ImageIO.h>
然后使用CGImageSource解码HEIF文件:
NSString *imgFilepath = @"你的HEIF文件路径"; CFURLRef fileURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (__bridge CFStringRef)imgFilepath, kCFURLPOSIXPathStyle, NO); CGImageSourceRef imageSource = CGImageSourceCreateWithURL(fileURL, NULL); if (imageSource) { // 读取HEIF文件中的第一个图像(HEIF可能包含多帧,按需调整索引) CGImageRef image = CGImageSourceCreateImageAtIndex(imageSource, 0, NULL); if (image) { // 在这里使用你的CGImage对象,使用完成后记得释放 // ... CGImageRelease(image); } CFRelease(imageSource); } CFRelease(fileURL);
方法二:通过数据提供者创建CGImage
如果已经获取到文件的NSData,也可以用DataProvider构建ImageSource:
NSData *imageData = [NSData dataWithContentsOfFile:imgFilepath]; CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData((__bridge CFDataRef)imageData); CGImageSourceRef imageSource = CGImageSourceCreateWithDataProvider(dataProvider, NULL); if (imageSource) { CGImageRef image = CGImageSourceCreateImageAtIndex(imageSource, 0, NULL); if (image) { // 使用image并后续释放 // ... CGImageRelease(image); } CFRelease(imageSource); } CGDataProviderRelease(dataProvider);
额外说明
CGImageSource会自动识别文件编码格式,不需要像之前那样判断扩展名,不仅支持HEIF,也兼容JPEG、PNG等格式,用这种方式可以统一你的图像加载逻辑。
内容的提问来源于stack exchange,提问作者Paolo
相关产品推荐
相关产品推荐

