如何通过Objective-C访问MacOS下HEIC文件的明暗版本并导出为JPG
实现原理
带明暗双版本的HEIC是Apple专用的自适应壁纸格式,文件内部包含多个独立的图像表示,分别绑定浅色、深色两种系统外观。默认NSImage初始化时只会加载当前系统激活外观对应的版本,因此你之前的代码只能拿到其中一种版本。
具体实现方案
方法1:直接读取所有图像表示(推荐,macOS 10.14+兼容)
直接遍历HEIC内的所有图像rep,通过属性区分明暗版本后分别转码:
NSString *wallpaper_path = /* 输入HEIC源路径 */; NSString *light_output_path = /* 浅色JPG输出路径 */; NSString *dark_output_path = /* 深色JPG输出路径 */; // 读取HEIC内所有图像表示 NSArray<NSImageRep *> *reps = [NSImageRep imageRepsWithContentsOfFile:wallpaper_path]; NSDictionary *jpgProps = @{NSImageCompressionFactor: @1.0}; for (NSImageRep *rep in reps) { // 获取当前图像绑定的外观类型 NSString *appearanceName = [rep valueForProperty:NSImageRepAppearanceName]; NSData *jpgData = [rep representationUsingType:NSJPEGFileType properties:jpgProps]; if ([appearanceName isEqualToString:NSAppearanceNameAqua]) { // 写入浅色版本 [jpgData writeToFile:light_output_path atomically:NO]; } else if ([appearanceName isEqualToString:NSAppearanceNameDarkAqua]) { // 写入深色版本 [jpgData writeToFile:dark_output_path atomically:NO]; } }
方法2:手动切换NSImage外观
如果需要兼容更低系统版本,可以主动指定NSImage的绘制外观,再生成对应版本的图像:
NSString *wallpaper_path = /* 输入HEIC源路径 */; NSString *light_output_path = /* 浅色JPG输出路径 */; NSString *dark_output_path = /* 深色JPG输出路径 */; NSImage *image = [[[NSImage alloc] initWithContentsOfFile:wallpaper_path] autorelease]; NSDictionary *jpgProps = @{NSImageCompressionFactor: @1.0}; // 生成浅色版本 [image setAppearance:[NSAppearance appearanceNamed:NSAppearanceNameAqua]]; NSData *lightTiffData = [image TIFFRepresentation]; NSBitmapImageRep *lightRep = [NSBitmapImageRep imageRepWithData:lightTiffData]; NSData *lightJpgData = [lightRep representationUsingType:NSJPEGFileType properties:jpgProps]; [lightJpgData writeToFile:light_output_path atomically:NO]; // 生成深色版本 [image setAppearance:[NSAppearance appearanceNamed:NSAppearanceNameDarkAqua]]; NSData *darkTiffData = [image TIFFRepresentation]; NSBitmapImageRep *darkRep = [NSBitmapImageRep imageRepWithData:darkTiffData]; NSData *darkJpgData = [darkRep representationUsingType:NSJPEGFileType properties:jpgProps]; [darkJpgData writeToFile:dark_output_path atomically:NO];
你可以通过open /System/Library/Desktop\ Pictures/Dome.heic命令打开系统自带的双版本HEIC,验证转换后的文件是否和预览应用展示的内容一致。
内容的提问来源于stack exchange,提问作者Yuufo
相关产品推荐
相关产品推荐

