我正在编写一些代码来在 C/C++ 中缩放 32 位 RGBA 图像。我写了一些尝试,有些成功,但速度很慢,最重要的是,大小图像的质量是不可接受的。
我比较了由 OpenGL(即我的视频卡)和我的例程缩放的相同图像,它的质量相差甚远。我已经用 Google 代码搜索过所有我认为会有所启发的东西(SDL、Allegro、wxWidgets、CxImage、GD、ImageMagick 等)的源代码树,但通常它们的代码要么错综复杂,要么分散在各处,要么充满汇编程序和很少或没有评论。我还阅读了维基百科和其他地方的多篇文章,但我只是没有找到关于我需要什么的明确解释。我了解插值和采样的基本概念,但我正在努力使算法正确。我不想在一个例程中依赖外部库,并且必须转换为它们的图像格式并返回。此外,无论如何我想知道如何自己做。:)
我以前看过一个关于堆栈溢出的类似问题,但并没有真正以这种方式回答,但我希望有人可以帮助我朝着正确的方向前进。也许指向我一些文章或伪代码......任何可以帮助我学习和做的事情。
这就是我要找的东西:
- 没有汇编程序(我正在为多种处理器类型编写非常便携的代码)。
- 不依赖外部库。
- 我主要关心的是缩小,但以后还需要编写一个放大例程。
- 结果的质量和算法的清晰度是最重要的(我可以稍后对其进行优化)。
我的例程基本上采用以下形式:
DrawScaled(uint32 *src, uint32 *dst,
src_x, src_y, src_w, src_h,
dst_x, dst_y, dst_w, dst_h );
谢谢!
更新:为了澄清,我需要比框重采样更先进的东西来缩小图像,这会使图像过于模糊。我怀疑我想要的是某种双三次(或其他)滤波器,它有点与双三次放大算法相反(即每个目标像素都是从所有贡献的源像素中计算出来的,并结合一个保持清晰的加权算法。
例子
这是我从 wxWidgets BoxResample 算法得到的结果与我想要的 256x256 位图缩放到 55x55 的示例。
- www.free_image_hosting.net/uploads/1a25434e0b.png
最后:
- www.free_image_hosting.net/uploads/eec3065e2f.png
原始 256x256 图像