c/c++语言开发共享C中最快的抖动/半色调库

我正在开发一个自定义瘦客户端服务器,为其客户端提供渲染的网页。 服务器在多核Linux机器上运行,Webkit提供了html渲染引擎。

唯一的问题是客户端显示受限于4位(16色)灰度调色板。 我目前正在使用LibGraphicsMagick抖动图像(RGB-> 4bit灰度),这是服务器性能的明显瓶颈。 分析表明,超过70%的时间用于运行GraphicsMagick抖动函数。

我已经探索了stackoverflow和Interwebs的高性能解决方案,但似乎没有人在各种图像处理库和抖动解决方案上做任何基准测试。

我会更乐意发现:

首选C语言库。

    根据所选择的算法,抖动将花费相当多的时间。

    实现Bayer(Matrix)和Floyd-Steinberg(Diffusion)抖动是相当简单的。

    使用MMX / SSE编码处理并行像素时,可以非常快速地进行拜耳滤波。 您也可以使用GPU着色器进行抖动/转换。

    FWIW,您已经在使用GraphicsMagick,但这里有一整套OSS图形库

    从Adisak提供的列表中,我没有任何测试,我会打赌AfterImage 。 Afterstep人对速度很着迷,并且还描述了一种聪明的算法。

    如果您的服务器可以配备具有OpenGL的体面的PCI-express显卡,您可以采取另一种方法。 以下是Nvidia的一些规格。 搜索“索引模式”。 您可以做的是选择16或256色显示模式,将图像渲染为平面多边形(如立方体侧面)上的纹理,然后再读取帧。

    从OpenGL卡读取帧时,卡的带宽很重要,因此需要PCI-express。 正如文档所述,您还必须在索引模式中选择颜色以获得不错的效果。

    我知道它不是一个C库,但是这让我很好奇.NET可以用来做错误扩散,这是我20年前在一个项目中使用的。 我发现了这个 ,特别是这个方法 。

    但要尝试帮助:)我找到了这个C库 。

    这是Floyd-Steinberg半色调方法的实现:

    #include  using namespace cv; int main(){ uchar scale = 128; // change this parameter to 8, 32, 64, 128 to change the dot size Mat img = imread("../halftone/tom.jpg", CV_LOAD_IMAGE_GRAYSCALE); for (int r=1; r(r,c); uchar newPixel = oldPixel / scale * scale; img.at(r,c) = newPixel; int quantError = oldPixel - newPixel; img.at(r+1,c) += 7./16. * quantError; img.at(r-1,c+1) += 3./16. * quantError; img.at(r,c+1) += 5./16. * quantError; img.at(r+1,c+1) += 1./16. * quantError; } } imshow("halftone", img); waitKey(); } 

      以上就是c/c++开发分享C中最快的抖动/半色调库相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/560252.html

      (0)
      上一篇 2021年1月27日
      下一篇 2021年1月27日

      精彩推荐