1

我必须在像素数组上实现涟漪效应。每个像素都是代表 ARGB 颜色的 32 位整数。有人对如何开始有任何建议吗?

4

1 回答 1

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);
}

当您拥有深度图时(如果您只想将相同的波纹应用于许多不同的图像,则可以预先计算),您有多种选择来处理它:

  • 与深度成比例地使每个像素变亮或变暗
  • 将深度图对角移动几个像素,并根据移位和未移位图之间的差异变亮或变暗。
  • 将图像中的每个像素稍微移动一个向量,该向量与每个像素的深度与其(例如)东、南邻居的深度之间的差异成正比。为了获得视觉上令人愉悦的结果,可能需要进行一些平滑或过采样,尤其是当您的基础图像包含清晰的轴平行边缘时。

可能需要对这些组合和变化进行一些实验,以近似您对所需效果的心理图景。

于 2011-09-11T21:10:07.843 回答