pixfmt_rgb24 PK pixfmt_bgr24

1 前言

       目前在windows平台上,依赖于VS开发环境,对于很多的例子采用了pixfmt_bgr24,而不是pixfmt_rgb24,进行了留心观察,实际上,如果使用pixfmt_rgb24,得不到我们想要的效果。实际上windows申请的渲染缓存的颜色分量是如下排列的BGR,而不是平常的RGB,至于在Linux平台上调用X11是什么情况暂时没有进行任何的测试!!      

2 定义

定义头文件:agg_pixfmt_rgb.h

具体定义如下:

   typedef pixfmt_alpha_blend_rgb<blender_rgb<rgba8,  order_rgb>, rendering_buffer> pixfmt_rgb24;    //----pixfmt_rgb24

typedefpixfmt_alpha_blend_rgb<blender_rgb<rgba8, order_bgr>, rendering_buffer> pixfmt_bgr24;    //----pixfmt_bgr24

两者之间的差异:

    struct order_rgb  { enum rgb_e { R=0, G=1, B=2, rgb_tag }; };      //----order_rgb

    struct order_bgr  { enum bgr_e { B=0, G=1, R=2, rgb_tag }; };      //----order_bgr

RGB颜色序列不一样。

3 困惑不解

       在这一个测试例程中,如果使用pixfmt_rgb24,然后使用agg::rgba8(255,0,0)颜色填充,渲染出来的是蓝色,实际上指定R分量为255,而不是B分量为255,追踪代码,还是一无所获,非得使用pixfmt_bgr24,真是百思不得其解!!与平台的渲染内存有关!!

4 对比测试代码

   agg::rendering_buffer &rbuf = rbuf_window();

   agg::pixfmt_bgr24 pixf(rbuf);

agg::pixfmt_rgb24pixf1(rbuf);

 for (int i = 20;i<250;i++)

 {//渲染出红色

     pixf.copy_hline(20,i,300,agg::rgba8(255,0,0));

 }

 

 for (int i = 20;i<250;i++)

 {//渲染出蓝色

    pixf1.copy_hline(420,i,300,agg::rgba8(255,0,0));

 }


 提供如下的一种方式直接操作渲染缓存,查看是否是颜色序列不一样导致的??

 agg::rendering_buffer &rbuf = rbuf_window();

   renb.clear(agg::rgba8(255,255,255));


    for (int i =0;i < rbuf.height();i++)

    {

      unsigned char* p = rbuf.row_ptr(i);

      for (int j=0;j<rbuf.width();j++)

      {

        *p++ = 255;//显示结果为蓝色

        *p++ = 0;

        *p++ = 0;

      }

    }


    for (int i =0;i < rbuf.height();i++)

    {

      unsigned char* p = rbuf.row_ptr(i);

      for (int j=0;j<rbuf.width();j++)

      {

        *p++ = 0;

        *p++ = 0;

        *p++ = 255;

      }

    }


你可能感兴趣的:(agg,pixfmt_bgr24,pixfmt_rgb24)