【问题标题】:Override specialized template覆盖专用模板
【发布时间】:2012-05-16 07:30:17
【问题描述】:

我一直在使用 Boost.GIL 来执行一些基本的图像处理程序。在 Boost.GIL 中,不同类型像素之间的色彩空间转换是通过一个通用的convert_pixel( ) 函数的模板特化来实现的。 但是,例如,我很想用基于 LCMS 的东西来覆盖这些实现。

是否有任何方法可以覆盖模板的特化,以便对 convert_pixel() 的任何内部调用都将使用新的基于 LCMS 的 convert_pixel()

最终回答

深入研究 GIL 设计手册(比教程有趣得多),我发现 Adob​​e 建议如何解决这个问题。对于我们感兴趣的人,此链接提供了答案:http://www.boost.org/doc/libs/1_49_0/libs/gil/doc/html/gildesignguide.html#NewColorConversionDG

【问题讨论】:

    标签: c++ templates boost boost-gil


    【解决方案1】:

    我对 GIL 不熟悉,在文档中只找到了类似的功能。但是,可能不需要回答这个问题。

    劫持原始调用,您应该能够覆盖转换。函数优先级应该来挽救这一天:普通函数总是比模板函数更受欢迎。假设原始模板特化是

    template<> 
    GIL_FORCEINLINE void boost::gil::copy_and_convert_pixels (const V1 &src, const V2 &dst, CC cc) { original_code; }
    

    你可以覆盖这个定义你的自定义非模板函数

    GIL_FORCEINLINE void boost::gil::copy_and_convert_pixels (const V1 &src, const V2 &dst, CC cc) { overridden_code; }
    

    您应该特别注意将函数定义到同名的同一个命名空间中,并在第一次调用之前包含它。

    【讨论】:

    • 不幸的是,虽然您的想法通常运作良好,但在这种特殊情况下却不行。事实上,颜色转换依赖于 boost/gil/color_convert.hpp 中定义的类 default_color_converter。 “技巧”就在那里,但我必须弄清楚如何替换它。不过,有新的挑战是件好事。
    【解决方案2】:

    FWIW,请参阅 this answer for an example 覆盖 boost::gil::color_convert扩展 boost::gil::copy_and_convert_pixels 行为,并使用 GIL 尚未提供的转换。

    我认为您在尝试替换 GIL 的color_convert.hpp 中定义的现有转换时会遇到问题;可能您想要/需要走的路线是定义一个新的颜色基础 c.f rgb_t、cmyk_t(例如 lcms_t ?),然后定义像 default_color_converter_impl&lt;rgb_t,lcms_t&gt; 这样的东西来与之互操作。

    【讨论】:

    • lcms 不是色彩空间,而是色彩空间转换管理的库:littlecms.com
    猜你喜欢
    • 1970-01-01
    • 2019-03-27
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多