我正在尝试用C语言编写这个程序来操作bmp图像,到目前为止,我已经成功地将其旋转如下:
for (row=0; row < rows; row++)
for (col=0; col < cols; col++)
{
(*new) + rows*col + (rows - row -1) = original + row*cols + col;
}
其中:原始=原始bmp,新=比例大小的新bmp,这取决于我要应用的旋转量。两者都是指向bmp的指针,而new是指向指针的指针。我已经做了几次计算,它逆时针旋转它,而实际上它应该顺时针旋转。这是一个问题,但我想我可以逆时针旋转它足够的时间,让它看起来像是顺时针旋转。我的问题是:如何从原始的bmp图像进行多次旋转,并使其最终显示在我正在创建的新的bmp图像上。也就是说,我如何多次执行上述操作,而仍然只有一个输入和一个输出文件的大小正确。我喜欢用指针来做这件事,因为这会让我更容易在其他过程中操作输出。我希望这是足够的细节。
谢谢。
发布于 2013-10-20 21:43:04
使用矩阵。伪码:
class Matrix {
double m11,m12,m21,m22;
};
dest.x = matrix.m11*src.x + matrix.m12*src.y;
dest.y = matrix.m21*src.x + matrix.m22*src.y;
where x = x - image.width/2 and y = y - image.height/2
http://en.wikipedia.org/wiki/Rotation_matrix#Common_rotations
发布于 2013-11-06 19:16:44
下面的代码演示了一个浮点数组旋转90度的倍数。我后来将浮动数组转换为字节数组,以便可以生成测试图像来验证结果;我没有包括这部分代码,因为它只是混淆了要点,并不是您真正想要的。如果你需要那部分,让我知道我会张贴它。
请注意,我做的是“错位”而不是“就地”的旋转。我相信后者才是你真正感兴趣的,但即便如此,下面的方法对你来说应该是一个很好的开始。关于就地转换的其他讨论可以是found here,它围绕转置类型操作(内存交换)的使用展开,但我没有时间对所有这些细节进行排序,我将这一部分留给您。
回想一下,对于n*90度的逆时针旋转,变换由下式给出:
因此,当然:
但在实际代码中,您需要分别将row‘和col’转换为imageHeight/2和imageWidth/2,如下面的代码所示,以避免将负索引传递给数组。
将row_p和col_p表示为row‘and col',代码如下:
// Note: nX = pixels wide, nY = pixels tall
float *dataVector = // some data source, arbitrary
// Setup the array for the out-of-place transformation:
float *dataVector2 = new float[nX*nY];
int n = -2; // Example: set n = -2 to rotate counter-clockwise 180 deg
for (int row = 0; row < nY; row++) {
for (int col = 0; col < nX; col++) {
int row_p = cosf(n*M_PI_2)*(row-nY/2) - sinf(n*M_PI_2)*(col-nX/2) + nY/2;
int col_p = sinf(n*M_PI_2)*(row-nY/2) + cosf(n*M_PI_2)*(col-nX/2) + nX/2;
dataVector2[row*nX + col] = dataVector[row_p*nX + col_p];
}
}
// Later convert float array to image ...
请注意,在上面的代码中,我使用旋转后的坐标来访问原始数组的元素,然后将这些值映射回原始的行、列坐标:
dataVector2[row*nX + col] = dataVector[row_p*nX + col_p];
这样做的结果是+n值给出了顺时针旋转;如果您希望逆时针旋转,只需将负值n传递给您的代码,即-n,如上面的示例所示。这样做的效果是只改变上面旋转矩阵的非对角项的符号。
希望这能有所帮助。
发布于 2013-11-07 04:17:31
简化代码的一种方法是定义您将沿着循环遍历的两个2D基础:
原始基数:
<代码>F29
新基地
用这些重写你的代码应该会容易得多。它还具有从内部循环中删除乘法的好处。
PIXEL *source = original;
PIXEL *target = new + (rows - 1) + (0 * cols);
int source_di = 1;
int source_dj = cols;
int target_di = rows;
int target_dj = -1;
for (int j = 0; j < rows; ++j) {
int saved_source = source;
int saved_target = target;
for (int i = 0; i < cols; ++i) {
*target = *source;
source += source_di;
target += target_di;
}
source = saved_source + source_dj;
target = saved_target + target_dj;
}
https://stackoverflow.com/questions/19481733
复制相似问题