在给定像素阵列的情况下,在C中实现涟漪效应

时间:2011-09-10 21:55:26

标签: c image ripple

我必须对像素数组实现涟漪效应。每个像素是32位整数,表示ARGB颜色。有没有人对如何开始有任何建议?

1 个答案:

答案 0 :(得分:3)

通常,纹波效应是图像的某种失真,其中失真量以“波浪”图案从一点到另一点变化。因此,第一项任务是创建一个“深度映射”,为每个像素生成一个数字。直观地,深度图将表示原始像素上方的波纹水面的高度。实验的起点可能是

#define X_CENTER 100   // x pixel position of center
#define Y_CENTER 100   // y pixel position of center
#define RADIUS 70      // approximate radius of circular wave train, in pixels
#define WAVELENGTH 10  // wavelength of ripples, in pixels
#define TRAINWIDTH 3.4 // approximate width of wave train, in wavelengths
#define SUPERPHASE 1.5 // phase vel. / group vel. (irrelevant for stills)

// returns a number from -1.0 to 1.0
double depth(int x, int y) {
  double dx = x - X_CENTER ; // or int, if the center coords are ints
  double dy = y - Y_CENTER ;
  double r = (sqrt(dx*dx+dy*dy)-RADIUS)/WAVELENGTH ;
  double k = r - (1-SUPERPHASE)*RADIUS/WAVELENGTH ;
  double a = 1 / (1.0 + (r/TRAINWIDTH)*(r/TRAINWIDTH));
  return a * sin(k*2*PI);
}

如果您有深度贴图(可以预先计算,如果您想要的是将相同的纹波应用于许多不同的图像),您可以使用各种选项来处理它:

  • 与每个像素的深度成比例变亮或变暗
  • 根据移位和不移位地图之间的差异,将深度贴图沿对角线移动几个像素,然后变亮或变暗。
  • 在图像中稍微移动每个像素一个矢量,该矢量与每个像素的深度与其(例如)东和南邻居之间的差异成比例。如果基本图像包含清晰的轴平行边缘,可能需要进行一些平滑或过采样以获得视觉上令人愉悦的效果。

可能需要进行一些实验,将这些组合和变体用于近似您对所需效果的心理描述。