【问题标题】:Resizing image using its data使用其数据调整图像大小
【发布时间】:2013-01-05 21:42:13
【问题描述】:

我有一个 C++ 程序,它读取图像文件,处理标题,然后将图像的颜色数据存储在指向字符指针的指针中

unsigned char** pixelData = new unsigned char*[header.width*header.height];
for(int i=0;i<header.width*header.height;i++)
    pixelData[i] = new unsigned char[bytes2read]; //bytes2read is 3(rgb) or 4(rgba)

如果我想将图像重新缩放到原始大小的一半,我该怎么做?有谁知道一个方便的算法吗?

【问题讨论】:

  • 对于缩小比例,您通常只需平均像素值,但花哨的算法使用双三次平移)。顺便问一下,你的意思是四分之一大小(每边一半)还是一半大小(每边 71%)?
  • 每边一半。我不是在寻找任何花哨的东西,只是一种在指向指针的指针中使用数据来获取较小图像的方法。目前只是概念验证。
  • 先从一个维度考虑。这真的很容易。

标签: c++ image rescale


【解决方案1】:

要提供良好结果的最简单方法是简单地平均每个 2x2 像素正方形的 R、G、B 值。

通常,您所做的是对图像应用过滤器以确定每个输出像素的新值。平均值是所谓的宽度为 2 的框式过滤器。您可以使用其他过滤器来提供更好或更差的结果,但我将从平均值开始。

【讨论】:

  • 如果宽度或高度是奇数,是最好省略最后一行/列,还是取一个3x2/2x3框的平均值?
  • @coolmrcroc,好问题。我会在不平均的情况下取最后一个像素,但是您提出的任何建议都足以满足简单的解决方案。真正正确的解决方案是将滤镜移动 1/2 像素并在边缘创建透明度。
【解决方案2】:

如何使用 OpenGL。这对于 OpenGL 来说几乎是微不足道的,最好的部分是该操作是 GPU 加速的。

【讨论】:

  • 我不能用,我得直接用数据
猜你喜欢
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多