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

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

我比较了OpenGL(即我的视频卡)和我的例程缩放的相同图像,它的质量相差数英里。 我搜索了谷歌代码,搜索了一些我认为可以点亮的东西(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图像


    我发现wxWidgets的实现非常简单,可以根据需要进行修改。 这是所有的C ++,所以没有可移植性的问题。 唯一的区别是它们的实现可以与无符号char数组一起工作(我发现它是处理图像的最简单方法),其中字节顺序为RGB,alpha组件位于单独的数组中。

    如果在wxWidgets源代码树中引用“src / common / image.cpp”文件,则会出现一个下采样函数,它使用箱采样方法“wxImage :: ResampleBox”和一个称为“wxImage :: ResampleBicubic”。


    一个相当简单和体面的算法来重新采样图像是双三次插值,维基百科单独拥有所有你需要的信息来实现。


    OpenGL是否可以在矢量域中进行缩放? 如果是这样,那么任何基于像素的缩放都无法在质量上接近它。 这是基于矢量的图像的一大优点。

    双厘米算法可以针对清晰度和伪像进行调整 - 我试图找到一个链接,我将在其中进行编辑。

    编辑:这是我正在考虑的Mitchell-Netravali工作,它在此链接的底部引用:

    http://www.cg.tuwien.ac.at/~theussl/DA/node11.html

    您也可以考虑将Lanczos重采样作为双三次的替代方案。

    链接地址: http://www.djcxy.com/p/50279.html

    上一篇: How do I do high quality scaling of a image?

    下一篇: Bmp to jpg/png in C#