我正在尝试用C语言编写一个函数,该函数将接收一个Picture(一个2D像素数组),然后将2D数组中的所有列都按指定的cols数移位。如果一个色点从图像上“移开”,则它应该回圈。
我写了一个算法,它似乎适用于我正在处理的特定类型的图片,该图片高266像素,宽427,但是如果移位是图片的任何因素,该算法将失效不是1或图像宽度。
这是代码:
void shiftImage(Picture * pic, int shift) {
int baseIndex = 0;
int width = pic->width;
//make shift as small as possible while maintaining the effect by moduloing the shift. Ensure shift is positive during modulo:
if(shift < 0) {
shift *= -1;
shift = shift % width;
shift *= -1;
} else {
shift = shift % width;
}
for(int height = 0; height < pic->height; height++) {
int index = baseIndex;
Pixel nextPixelToShift;
Pixel pixelGettingShifted = pic->pix_array[height][baseIndex];
//shift every pixel in the row by shift amount
do {
index = index + shift;
//if index < 0, then wrap to end of array and move back proper num of cols. Otherwise, wrap back to the beginning using mod.
if(index < 0) {
index = width + index;
} else {
index = index % width;
}
nextPixelToShift = pic->pix_array[height][index];
pic->pix_array[height][index] = pixelGettingShifted;
pixelGettingShifted = nextPixelToShift;
} while (index != baseIndex);
}
关于如何使该算法在任何偏移量下都能工作的任何建议?
我知道我可以通过创建一个与图片中的行大小相同的临时数组来实现此目的。然后,我可以遍历图片数组行中的每个元素,并针对每个元素将其复制到移位索引处的临时数组中。一旦将所有内容复制到临时数组中,就可以将临时数组中的元素复制到图片数组中。但是,我担心这样做会占用内存,即使在每个循环之后都会释放数组。这也将效率较低。