如何对图像进行高质量缩放?

Pat*_*gan 18 c c++ image-manipulation image image-scaling

我正在编写一些代码来缩放C/C++中的32位RGBA图像.我已经写过一些有些成功的尝试,但它们很慢,最重要的是尺寸图像的质量是不可接受的.

我比较了由OpenGL(即我的视频卡)和我的例程缩放的相同图像,它的质量相差几英里.我已经搜索了Google代码,搜索了我认为可以解决一些问题的源代码树(SDL,Allegro,wxWidgets,CxImage,GD,ImageMagick等),但通常他们的代码要么是错综复杂的,要么分散在各处或者是谜语汇编程序,很少或没有评论.我还阅读了维基百科和其他地方的多篇文章,我只是没有找到我需要的明确解释.我理解插值和采样的基本概念,但我很难让算法正确.我不想依赖外部库来完成一个例程,并且必须转换为它们的图像格式并返回.此外,无论如何,我想知道如何自己做.:)

我之前看过一个关于堆栈溢出问题的类似问题,但它并没有真正以这种方式回答,但我希望有人可以帮我推动我朝着正确的方向前进.也许指点我一些文章或伪代码......任何可以帮助我学习和做的事情.

这是我正在寻找的:

  1. 没有汇编程序(我正在为多种处理器类型编写非常可移植的代码).
  2. 没有外部库的依赖.
  3. 我主要关注的是缩放DOWN,但是稍后还需要编写一个扩展例程.
  4. 结果的质量和算法的清晰度是最重要的(我可以在以后优化它).

我的例程基本上采用以下形式:

DrawScaled(uint32 *src, uint32 *dst, 
      src_x, src_y, src_w, src_h, 
      dst_x, dst_y, dst_w, dst_h );
Run Code Online (Sandbox Code Playgroud)

谢谢!

更新:为了澄清,我需要一些比盒子重新采样更先进的东西用于降尺度,这会使图像模糊不清.我怀疑我想要的是某种双三次(或其他)滤波器,它与双三次升频算法有些相反(即每个目标像素都是从所有贡献的源像素计算出来的,并结合了保持锐利的加权算法.

这是我从wxWidgets BoxResample算法得到的例子与我想要的256x256位图缩放到55x55的例子.

  • www.free_image_hosting.net/uploads/1a25434e0b.png

最后:

  • www.free_image_hosting.net/uploads/eec3065e2f.png

原始的256x256图像

Dan*_*Dan 2

我发现 wxWidgets 实现相当简单,可以根据需要进行修改。它全部是 C++,因此不存在可移植性问题。唯一的区别是,它们的实现适用于 unsigned char 数组(我发现这是处理图像的最简单方法),其中 RGB 字节顺序和 alpha 分量位于单独的数组中。

如果您参考 wxWidgets 源代码树中的“src/common/image.cpp”文件,则有一个使用框采样方法“wxImage::ResampleBox”的下采样器函数和一个名为“wxImage::重新采样双三次”。