2014-11-20 56 views
0

我無法旋轉圖像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); 
     } 
    } 
} 

回答

1

首先你的代碼非常c風格。這很酷,我喜歡這種編碼,但是你可以通過引用讓你的生活更輕鬆。爲您的代碼

解決方案: 你從未點imageIn,只需在複印的圖像價值rotateImg:

image rotateImg; 
image *ptr = (image*) &rotateImg; 
*ptr = *imageIn; 

這意味着你只需要修改局部變量rotateImg而不是對象,它是由指針給出。

這裏只是一個普通的NO: ptr指向一個圖像。每個+ j表示「轉到下一個圖像」或更精確:ptr = ptr + sizeof(圖像);這應該是大約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++代碼風格,但看看參考

void RotateClockWise(image& imageIn) 
+0

我試過了,它應該是正確的代碼。這樣做更有意義,但是我的程序突破了我老師寫的一個功能,我們不應該編輯它。我現在沒有太多可以做的。謝謝你讓這個更清晰。 – 2014-11-20 17:50:31

+0

沒問題,幫助很有趣,其他人也幫助我^^ – stupidstudent 2014-11-20 17:52:27

1

您有imageIn參數可能指向要旋轉的圖像。但是,您創建了rotateImg對象,獲取指向此對象的指針(ptr)並將imageIn複製到此ptr。所以,現在你操縱圖像複製而不是圖像本身,這就是爲什麼imageIn指向的對象永遠不會改變其值。

+0

所以你說我應該擺脫rotateImg和使用imageIn指針?當我嘗試使用getHeight()和getWidth()函數時,這些賦值語句不再有效。 – 2014-11-20 17:29:40

+0

好吧,這段代碼需要多次更改才能強制它工作;我只是說你爲什麼'imageIn'永遠不會改變它的像素。 – Vitaliy 2014-11-20 17:31:12