多线程处理图片色彩管理器也要能共享上一篇我们聊了colorSpaceManager它能帮你创建和管理色彩空间。但有一个问题如果你的照片编辑 APP 需要在后台线程处理大量图片比如批量滤镜、批量导出普通的colorSpaceManager创建出来的对象是不能跨线程传递的。为什么呢因为在 ArkTS 的并发模型里不同线程之间的对象默认是隔离的你不能直接把一个线程里创建的对象传给另一个线程用。如果你尝试这么做运行时会报错。HarmonyOS 提供了sendableColorSpaceManager这个模块来解决这个问题。它创建出来的色彩管理器实现了ISendable接口可以在主线程、TaskPool、Worker 等并发实例之间传递而且传递的方式是引用传递——也就是说多个线程共享同一个对象修改会互相影响。导入模块import{colorSpaceManager,sendableColorSpaceManager}fromkit.ArkGraphics2D;注意这里同时导入了两个模块。因为sendableColorSpaceManager的参数类型比如ColorSpace枚举、ColorSpacePrimaries接口都定义在colorSpaceManager里所以两个都要导入。普通版与可共享版对比下面是两种色彩管理器的使用场景对比单线程多线程需要色彩管理器使用场景?colorSpaceManagersendableColorSpaceManager照片编辑预览滤镜实时预览色彩空间显示TaskPool 批量处理Worker 后台导出多线程色彩转换普通 Array 返回ISendable 接口collections.Array 返回创建标准可共享色彩空间跟普通版本的用法几乎一样只是把colorSpaceManager.create换成了sendableColorSpaceManager.createimport{colorSpaceManager,sendableColorSpaceManager}fromkit.ArkGraphics2D;letcolorSpace:sendableColorSpaceManager.ColorSpaceManager;colorSpacesendableColorSpaceManager.create(colorSpaceManager.ColorSpace.SRGB);这里有几个细节值得注意返回类型不同普通版返回的是colorSpaceManager.ColorSpaceManager而这里返回的是sendableColorSpaceManager.ColorSpaceManager。虽然名字一样但它们是不同的类型。可共享版本实现了ISendable接口所以能跨线程传递。参数来源相同色彩空间的枚举值ColorSpace还是来自colorSpaceManager可共享版本并没有重新定义一套枚举。UNKNOWN 和 CUSTOM 同样不能直接创建跟普通版一样这两个枚举值不能传给create方法。创建自定义可共享色彩空间如果你需要处理自定义色彩空间的照片也可以创建自定义的可共享色彩管理器import{colorSpaceManager,sendableColorSpaceManager}fromkit.ArkGraphics2D;letcolorSpace:sendableColorSpaceManager.ColorSpaceManager;letprimaries:colorSpaceManager.ColorSpacePrimaries{redX:0.1,redY:0.1,greenX:0.2,greenY:0.2,blueX:0.3,blueY:0.3,whitePointX:0.4,whitePointY:0.4};letgamma:number2.2;colorSpacesendableColorSpaceManager.create(primaries,gamma);跟普通版完全一样的参数只是调用的是sendableColorSpaceManager.create。创建出来的对象同样继承了ISendable可以在多线程间共享。查询属性跟普通版一样的方法可共享版本的ColorSpaceManager实例提供了跟普通版一样的属性查询方法但 API 签名稍有不同。获取色彩空间类型letspaceName:colorSpaceManager.ColorSpacecolorSpace.getColorSpaceName();注意返回类型直接用了colorSpaceManager.ColorSpace没有 try-catch 的示例。在实际使用中建议你还是加上错误处理。获取白点值import{collections}fromkit.ArkTS;letpoint:collections.ArraynumbercolorSpace.getWhitePoint();这里有个小区别可共享版本返回的是collections.Arraynumber而不是普通的Arraynumber。collections.Array是 ArkTS 提供的可共享数组类型同样能在多线程间传递。使用时你需要额外导入collections模块。获取 gamma 值letgamma:numbercolorSpace.getGamma();这个跟普通版完全一样返回一个浮点数。多线程批量处理流程下面是使用 sendableColorSpaceManager 进行批量图片处理的典型流程主线程创建可共享色彩空间传递给 TaskPool工作线程1工作线程2工作线程3处理图片批次1处理图片批次2处理图片批次3色彩空间转换导出处理结果实际场景后台批量处理图片的色彩管理想象一下这个场景你的照片编辑 APP 有一个批量导出功能用户选了 100 张照片要全部转换成 SRGB 色彩空间后导出。这个过程如果在主线程做UI 会卡死。所以你要用 TaskPool 来做。使用sendableColorSpaceManager的流程是这样的在主线程创建可共享的色彩空间对象import{colorSpaceManager,sendableColorSpaceManager}fromkit.ArkGraphics2D;// 创建一个 SRGB 色彩空间用于批量导出lettargetColorSpacesendableColorSpaceManager.create(colorSpaceManager.ColorSpace.SRGB);把对象传给 TaskPool 的工作线程因为targetColorSpace实现了ISendable接口你可以直接把它作为参数传给 TaskPool 的任务。在工作线程里你可以直接使用这个对象来做色彩空间转换不需要重新创建。在工作线程里使用工作线程拿到这个对象后可以调用getColorSpaceName()来确认目标色彩空间类型然后对每张图片做转换。什么时候该用可共享版本简单说如果你的色彩管理器只在主线程用就用普通的colorSpaceManager如果需要在多个线程间共享就用sendableColorSpaceManager。具体来说单线程场景普通的照片编辑、滤镜预览、色彩空间显示等用colorSpaceManager就够了。多线程场景批量图片处理、后台导出、TaskPool/Worker 中的色彩转换等必须用sendableColorSpaceManager。性能方面可共享版本因为要支持跨线程引用传递可能会有轻微的额外开销。但对于色彩管理这种操作频率不高的场景这个开销完全可以忽略。小结sendableColorSpaceManager本质上就是colorSpaceManager的多线程安全版本。它的 API 设计几乎一模一样区别就是创建出来的对象可以跨线程共享。如果你的 APP 有多线程处理图片的需求记得用它来替代普通的色彩管理器。最后提醒一下因为是引用传递多个线程共享同一个对象所以如果你在一个线程里修改了对象的状态虽然目前的 API 都是只读的其他线程会立即看到变化。在设计并发逻辑时要注意这一点。
鸿蒙开发-想在多线程间共享色彩配置?sendableColorSpaceManager怎么用
发布时间:2026/6/1 3:17:00
多线程处理图片色彩管理器也要能共享上一篇我们聊了colorSpaceManager它能帮你创建和管理色彩空间。但有一个问题如果你的照片编辑 APP 需要在后台线程处理大量图片比如批量滤镜、批量导出普通的colorSpaceManager创建出来的对象是不能跨线程传递的。为什么呢因为在 ArkTS 的并发模型里不同线程之间的对象默认是隔离的你不能直接把一个线程里创建的对象传给另一个线程用。如果你尝试这么做运行时会报错。HarmonyOS 提供了sendableColorSpaceManager这个模块来解决这个问题。它创建出来的色彩管理器实现了ISendable接口可以在主线程、TaskPool、Worker 等并发实例之间传递而且传递的方式是引用传递——也就是说多个线程共享同一个对象修改会互相影响。导入模块import{colorSpaceManager,sendableColorSpaceManager}fromkit.ArkGraphics2D;注意这里同时导入了两个模块。因为sendableColorSpaceManager的参数类型比如ColorSpace枚举、ColorSpacePrimaries接口都定义在colorSpaceManager里所以两个都要导入。普通版与可共享版对比下面是两种色彩管理器的使用场景对比单线程多线程需要色彩管理器使用场景?colorSpaceManagersendableColorSpaceManager照片编辑预览滤镜实时预览色彩空间显示TaskPool 批量处理Worker 后台导出多线程色彩转换普通 Array 返回ISendable 接口collections.Array 返回创建标准可共享色彩空间跟普通版本的用法几乎一样只是把colorSpaceManager.create换成了sendableColorSpaceManager.createimport{colorSpaceManager,sendableColorSpaceManager}fromkit.ArkGraphics2D;letcolorSpace:sendableColorSpaceManager.ColorSpaceManager;colorSpacesendableColorSpaceManager.create(colorSpaceManager.ColorSpace.SRGB);这里有几个细节值得注意返回类型不同普通版返回的是colorSpaceManager.ColorSpaceManager而这里返回的是sendableColorSpaceManager.ColorSpaceManager。虽然名字一样但它们是不同的类型。可共享版本实现了ISendable接口所以能跨线程传递。参数来源相同色彩空间的枚举值ColorSpace还是来自colorSpaceManager可共享版本并没有重新定义一套枚举。UNKNOWN 和 CUSTOM 同样不能直接创建跟普通版一样这两个枚举值不能传给create方法。创建自定义可共享色彩空间如果你需要处理自定义色彩空间的照片也可以创建自定义的可共享色彩管理器import{colorSpaceManager,sendableColorSpaceManager}fromkit.ArkGraphics2D;letcolorSpace:sendableColorSpaceManager.ColorSpaceManager;letprimaries:colorSpaceManager.ColorSpacePrimaries{redX:0.1,redY:0.1,greenX:0.2,greenY:0.2,blueX:0.3,blueY:0.3,whitePointX:0.4,whitePointY:0.4};letgamma:number2.2;colorSpacesendableColorSpaceManager.create(primaries,gamma);跟普通版完全一样的参数只是调用的是sendableColorSpaceManager.create。创建出来的对象同样继承了ISendable可以在多线程间共享。查询属性跟普通版一样的方法可共享版本的ColorSpaceManager实例提供了跟普通版一样的属性查询方法但 API 签名稍有不同。获取色彩空间类型letspaceName:colorSpaceManager.ColorSpacecolorSpace.getColorSpaceName();注意返回类型直接用了colorSpaceManager.ColorSpace没有 try-catch 的示例。在实际使用中建议你还是加上错误处理。获取白点值import{collections}fromkit.ArkTS;letpoint:collections.ArraynumbercolorSpace.getWhitePoint();这里有个小区别可共享版本返回的是collections.Arraynumber而不是普通的Arraynumber。collections.Array是 ArkTS 提供的可共享数组类型同样能在多线程间传递。使用时你需要额外导入collections模块。获取 gamma 值letgamma:numbercolorSpace.getGamma();这个跟普通版完全一样返回一个浮点数。多线程批量处理流程下面是使用 sendableColorSpaceManager 进行批量图片处理的典型流程主线程创建可共享色彩空间传递给 TaskPool工作线程1工作线程2工作线程3处理图片批次1处理图片批次2处理图片批次3色彩空间转换导出处理结果实际场景后台批量处理图片的色彩管理想象一下这个场景你的照片编辑 APP 有一个批量导出功能用户选了 100 张照片要全部转换成 SRGB 色彩空间后导出。这个过程如果在主线程做UI 会卡死。所以你要用 TaskPool 来做。使用sendableColorSpaceManager的流程是这样的在主线程创建可共享的色彩空间对象import{colorSpaceManager,sendableColorSpaceManager}fromkit.ArkGraphics2D;// 创建一个 SRGB 色彩空间用于批量导出lettargetColorSpacesendableColorSpaceManager.create(colorSpaceManager.ColorSpace.SRGB);把对象传给 TaskPool 的工作线程因为targetColorSpace实现了ISendable接口你可以直接把它作为参数传给 TaskPool 的任务。在工作线程里你可以直接使用这个对象来做色彩空间转换不需要重新创建。在工作线程里使用工作线程拿到这个对象后可以调用getColorSpaceName()来确认目标色彩空间类型然后对每张图片做转换。什么时候该用可共享版本简单说如果你的色彩管理器只在主线程用就用普通的colorSpaceManager如果需要在多个线程间共享就用sendableColorSpaceManager。具体来说单线程场景普通的照片编辑、滤镜预览、色彩空间显示等用colorSpaceManager就够了。多线程场景批量图片处理、后台导出、TaskPool/Worker 中的色彩转换等必须用sendableColorSpaceManager。性能方面可共享版本因为要支持跨线程引用传递可能会有轻微的额外开销。但对于色彩管理这种操作频率不高的场景这个开销完全可以忽略。小结sendableColorSpaceManager本质上就是colorSpaceManager的多线程安全版本。它的 API 设计几乎一模一样区别就是创建出来的对象可以跨线程共享。如果你的 APP 有多线程处理图片的需求记得用它来替代普通的色彩管理器。最后提醒一下因为是引用传递多个线程共享同一个对象所以如果你在一个线程里修改了对象的状态虽然目前的 API 都是只读的其他线程会立即看到变化。在设计并发逻辑时要注意这一点。