我无法将图像旋转90度,图像为768 x 768像素。我在这里展示的代码能够创建一个新的图像,但我写的功能根本就不能操作它。我在驱动程序中旋转它的图像类和功能如下。我必须顺时针和逆时针旋转所有图片90度;我认为我的问题是试图找到正确切换像素的指针。
class image {
public:
image(); //the image constructor (initializes everything)
image(string filename); //a image constructor that directly loads an image from disk
image(image &other); //copy constructor
~image(); //the image destructor (deletes the dynamically created pixel array)
pixel** getPixels(); //return the 2-dimensional pixels array
int getWidth(); //return the width of the image
int getHeight(); //return the height of the image
void createNewImage(int width, int height);
private:
pixel** pixels; // pixel data array for image
int width, height; // stores the image dimensions
void pixelsToCImage(CImage* myImage);
};
void RotateClockWise(image *imageIn)
{
image rotateImg;
image *ptr = (image*) &rotateImg;
*ptr = *imageIn;
int height = rotateImg.getHeight();
int width = rotateImg.getWidth();
pixel** rotatePix = rotateImg.getPixels();
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
rotatePix[i][j] = rotatePix[j][i];
*(ptr + j * height + (height - i - 1)) = *(ptr + i * width + j);
}
}
}
答案 0 :(得分:1)
您有imageIn
参数,可能指向您要旋转的图像。但是,您创建rotateImg
对象,获取指向此对象的指针(ptr
)并将imageIn
复制到此ptr
。所以,现在你操纵图像副本而不是图像本身,这就是imageIn
指向的对象永远不会改变其值的原因。
答案 1 :(得分:1)
首先你的代码非常简洁。这很酷,我喜欢这种编码,但你可以通过参考使你的生活更轻松。
您的代码解决方案: 你永远不会将指针设置为imageIn,只需将image中的值复制到rotateImg:
image rotateImg;
image *ptr = (image*) &rotateImg;
*ptr = *imageIn;
这意味着你只需要修改局部变量rotateImg而不是指针给出的对象。
这里只是一个简单的NO: ptr指向图像。每个+ j意味着“转到下一个图像”或更精确:ptr = ptr + sizeof(image);应该是大约12个字节+ vtable。不要这样做。您可以在循环一维像素阵列时执行此操作。
*(ptr + j * height + (height - i - 1)) = *(ptr + i * width + j); //BAD
这是解决问题的一些C样式代码。我不知道你可以通过双指针** ptr(间接指针)给出一个二维数组。
void RotateClockWise(image* imageIn)
{
image rotateImg;
rotateImg = *imageIn;
image *ptr = imageIn;
int height = rotateImg.getHeight();
int width = imageIn->getWidth();
pixel** normalPix = rotateImg.getPixels();
pixel** rotatePix = imageIn->getPixels();
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
rotatePix[i][j] = normalPix[(height-1)-j][(width-1)-i];
}
}
}
我懒得用C ++ Style编写它,但看一下Reference
void RotateClockWise(image& imageIn)