c++ - 将图像转换为有限大小的调色板的好算法是什么

标签 c++ image algorithm palette

我正在尝试找出一种算法,将图像(8 位或 32 位)转换为 3 或 4 种自定义颜色(非灰度)的有限调色板。

这可能吗?

我正在尝试使用 C++(但我可以从其他语言获得它)

Qt 似乎已经有了一个调色板——虽然我不明白它的用法,但它似乎强制在它自己的标准调色板之一上显示,我没有看到任何自定义它的方法。

我将不胜感激一些算法示例或建议。

最佳答案

通过使用 convertToFormat 传入 QRgb 值数组,您可以将图像转换为使用固定数量的颜色:

http://qt-project.org/doc/qt-5/qimage.html#convertToFormat-2

在那种情况下没有抖动……它只是选择最接近的颜色来使用。所以这不是强制你选择调色板,而是你必须决定使用什么颜色。 Internet 上有很多“来自图像的调色板”生成器,如果您想选择 N 种“最佳”颜色用于图像,您可以查看它们,尽管这将是一种启发式方法。

如果你想要抖动,你可以从 Meego 的这个案例这样的资源开始:

https://github.com/openwebos/qt/blob/master/src/plugins/graphicssystems/meego/dithering.cpp

经常有这样的任务的人会使用 ImageMagick:

http://www.imagemagick.org/Usage/quantize/

关于c++ - 将图像转换为有限大小的调色板的好算法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25333903/

相关文章:

c++ - #if 预处理器指令可以嵌套在 C++ 中吗?

image - 如何将 ID2D1Bitmap 保存为 PNG 文件

java - 将 ACM 图形窗口转换为图像文件

c++ - OpenCV cvSaveImage Jpeg 压缩因子

c++ - shader.hlsl 文件导致错误?

c++ - 访问线程内的主对话框变量 (MFC)

c++ - 为什么这个 proto/phoenix 玩具示例会崩溃?

javascript - 在二维区域内为对象寻找空间的算法

algorithm - 高效检查一个点是否在二维的大量三角形内

algorithm - 学习形式语言、自动机、算法和数据结构的最佳站点是什么?