代码之家  ›  专栏  ›  技术社区  ›  Fire Lancer

支持多种像素格式

  •  0
  • Fire Lancer  · 技术社区  · 14 年前

    我需要写一些代码,这些代码将在许多像素格式上操作(例如A8R8G8B8、R8G8B8、R5G6B6,甚至可能是浮点格式)。

    我唯一能想到的是某种接口,它可以处理像素格式转换,例如:

    class IBitmap
    {
    public:
        virtual unsigned getPixel(unsigned x, unsigned y)const=0;
        virtual void setPixel(unsigned x, unsigned y, unsigned argb)=0;
        virtual unsigned getWidth()const=0;
        virtual unsigned getHeight()const=0;
    };
    

    有没有其他选项可以让我有效地支持所有这些格式?一般来说,我的代码可能只对位图的一小部分进行操作,在许多情况下需要读/写访问(混合)。

    5 回复  |  直到 14 年前
        1
  •  1
  •   morechilli    14 年前

    考虑使用模板。这将允许您在可能的情况下编写泛型代码,并在编译时专门编写代码

    有时称为静态多态性。 http://en.wikipedia.org/wiki/Curiously_Recurring_Template_Pattern

        2
  •  0
  •   gregg    14 年前

    在现代处理器上,虚拟函数的速度非常快,所以我不确定是否会立刻拒绝它们。进行一两次定时测试以确定。虚拟函数为您提供了运行时多态性,允许您编写(或在编译时生成)更少的代码。模板所表示的静态多态性可能会导致编译器生成大量您试图避免的代码。

        3
  •  0
  •   AshleysBrain    14 年前

    为了避免编写大量的格式,编写一个Color类或类似的类,它总是存储一个特定的格式(例如A8R8G8B8或A32R32G32B32F),然后在该类上有方法以不同的格式检索,例如。 get(FORMAT_R5G6B6) 或者类似的。然后,所有方法都可以处理该类。只要有可能,只转换一次颜色(例如,当绘制一个矩形时,将矩形颜色转换为目标格式,然后将其写入所有像素-不要对每个像素进行转换!)。

        4
  •  0
  •   rwong    14 年前

    (这是我的新答案,因为经过广泛的研究,我得出结论,adobegil不适合用于此目的。)

    我强烈推荐Windows映像组件的体系结构和界面设计。

    我的意思是:

    • 我推荐他们的界面。不是实施。
      • 每个人都可以实现类似的功能。实际上,Mono项目(Wine)包含WIC的部分实现。
    • WIC使用管道存储模型,而不是生产者-消费者模型。
      • 只读位图实现 IWICBitmapSource 接口
        • 只有5个成员方法。
      • 可写位图实现 IWICBitmap 并提供对像素数据的直接存储器读/写访问。
        • 作为“存储”类意味着这个类在生成像素值时不依赖任何其他位图实例。
        5
  •  0
  •   Mark Ransom    14 年前

    更快 使用这种方法,尽管它涉及到一位像素,但当仍然压缩时,这些像素本身就很难处理。

    对像素级函数调用保持警惕是正确的。我从来没有见过像素函数不能使处理速度慢得让人无法接受的情况。