You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 20:18:00