Вращение изображения PNG в C ++ - PullRequest
0 голосов
/ 17 ноября 2018

Я новичок в C ++.

У меня есть изображение PNG, которое я пытаюсь повернуть на 180 градусов.

Изображение должно быть сохранено как новый файл.

Я написал немного кода, но попал в кирпичную стену, и мы будем благодарны за любые советы о том, как продолжить. Код пока ниже, спасибо заранее.

#include <QCoreApplication>
#include <iostream>
#include "ImageHandle.h"

using namespace std;

void rotatedImage (unsigned PixelGrid[WIDTH][HEIGHT]);

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
const char LogoFile[] = "Airplane.png";

unsigned PixelGrid[WIDTH][HEIGHT];     // Image loaded from file

// If the file cannot be loaded ...
if (!loadImage(PixelGrid, LogoFile))
{
    // Display an error message
    cout << "Error loading file \"" << LogoFile << "\"" << endl;
}
else
{
    cout << "File \"" << LogoFile << "\" opened successfully" << endl;

    // Demo of use of saveImage - to create a copy as "Airplane.png"
    // This should be modified to save the new images as specified
    if (saveImage(PixelGrid, "AirplaneCopy.png"))
    {
        cout << "File \"AirplaneCopy.png\" saved successfully" << 
endl;
    }
    else
    {
        cout << "Could not save \"AirplaneCopy.png\"" << endl;
    }
}

rotatedImage(PixelGrid);

{
    if (saveImage(PixelGrid, "AirplaneRotated.png"))
    {
        cout << "\nFile\"AirplaneRotated.png\" saved successfully" << 
endl;
    }
    else
    {
        cout << "\nCould not save \"AirplaneRotated.png\"" << endl;
    }
}

return a.exec();
}

void rotatedImage (unsigned PixelGrid[WIDTH][HEIGHT])
{
int row;
int col;

for (row = 0; row < WIDTH; row++)
{
    for (col = 0; col < HEIGHT; col++)
    {
        PixelGrid[row][col] = 
    }
}
}

Еще раз спасибо.

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Это очень легко сделать для поворота на 180 градусов.

Вам нужно перевернуть массив следующим образом.

Original           Flipped rows      and Finally Flipped cols

[0][0 , 1, 2]      [2][0, 1, 2]    [2][2, 1, 0]

[1][0 , 1, 2]      [1][0, 1, 2]    [1][2, 1, 0]

[2][0 , 1, 2]      [0][0, 1, 2]    [0][2, 1, 0]

Вам нужно только перевернуть строки и столбцы в другом направлении массива.

0 голосов
/ 17 ноября 2018

Если все, что вам нужно, поверните изображение на 180 градусов, я думаю, вы можете использовать простой цикл на половине изображения и поменять местами в каждой итерации позицию на 1 пару пикселей.

Давайте посмотрим на пиксель в положении(i,j) - где он должен быть после поворота?потому что это 180, он должен быть на (WIDTH - i, HEIGHT -j), поэтому ваш rotatedImage должен выглядеть следующим образом:

void rotatedImage (unsigned PixelGrid[WIDTH][HEIGHT])
{
    int row;
    int col;

    for (row = 0; row < WIDTH/2; row++)// because you only have to loop on half the image
    {
        for (col = 0; col < HEIGHT; col++) 
        {
            unsigned temp = PixelGrid[row][col];
            PixelGrid[row][col] = PixelGrid[WIDTH - row][HEIGHT - col];
            PixelGrid[WIDTH - row][HEIGHT - col] = temp;
        }
    }
}

Я не c++ эксперт, поэтому я надеюсь, что у меня нет синтаксической ошибки, и я никогда не проверяю, чтотак что остерегайтесь массива из индекса, я могу пропустить

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...