如何对图像进行高质量缩放?
我正在编写一些代码来在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的例子。
最后:
原始的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#