使用类旋转图像

时间:2014-11-20 16:59:25

标签: c++ image visual-studio-2010 class rotation

我无法将图像旋转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);
         }
     }
}

2 个答案:

答案 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)