Nana开发: 图像处理算法接口的介绍

在0.2.2版本中,Nana C++ Library提供了一个灵活配置图像处理算法的机制。对于一个抽象的算法,可能会有多种实现。例如,Nana C++ Library提供了两个图像缩放算法,他们分别是双线性插值算法(bilinear interoplation)和最邻近插值(proximal interoplation),用户可以根据不同的需求来切换算法。
参考例子:
http://stdex.sourceforge.net/help/paint/image_process_selector.htm

由于跨平台的特性,Nana并没有使用特定的平台指令来实现内部提供的算法,这些代码应该很好地工作在不同的编译器环境中。在需要考虑算法效率的特定情况下,尽管 Nana C++ Library没有提供使用平台指令的算法,但是程序员可以自己实现这样的算法,并配置以供Nana库调用。

现在我们使用MMX指令实现一个图像混合算法。
实现一个可以被Nana库使用的图像混合算法,我们必须使用class blend_interface, 这个类定义在Nana头文件<nana/paint/image_process_interface.hpp>中。

class blend_interface
{
public:
    virtual ~blend_interface() = 0;
    virtual void process(nana::paint::drawable_type dw_dst, const nana::rectangle& r_dst,
                         const paint::pixel_buffer& s_pixbuf, const nana::point& s_pos, double fade_rate) const = 0;
};

dw_dst:        目标对象.
r_dst:            目标混合区域.
s_pixbuf:      源像素缓存.
s_pos:          源坐标.
fade_rate:    混合比率.

目标混合区域总是有效的,由Nana库在计算并验证之后传入到该函数中。因此我们在使用这些数据时不必检测它们是否有效。

该算法的语义:
dw_dst = dw_dst * fade_rate + s_pixbuf *(1 - fade_rate)

现在开始!


#include <nana/paint/image_process_interface.hpp>

class blend_mmx
    : public nana::paint::image_process::blend_interface
{

    virtual void process(nana::paint::drawable_type dw_dst, const nana::rectangle& r_dst,
                         const paint::pixel_buffer& s_pixbuf, const nana::point& s_pos, double fade_rate) const
    {
        nana::paint::pixel_buffer d_pixbuf(dw_dst, r_dst.y, r_dst.height);
        nana::pixel_rgb_t * d_rgb = d_pixbuf.raw_ptr();

        if(d_rgb)
        {
            d_rgb += r_dst.x;
            nana::pixel_rgb_t * s_rgb = s_pixbuf.raw_ptr(s_pos.y) + s_pos.x;

            const unsigned rest = r_dst.width &
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值