зеркальная половина изображения с ++ - PullRequest
0 голосов
/ 02 октября 2018

так что я пытаюсь отразить изображение, хотя только половину его, чтобы мое изображение (зебра) имело либо две задницы, либо две головы, на самом деле не имеет значения, какая именно.мне удалось серой шкалой половину изображения с кодом, который я имею ниже.Как я должен сделать, чтобы отразить это вместо того, чтобы сделать это серым?

int main()
{
    sf::Image image;
    image.loadFromFile("../Images/zebra.bmp"); 
    sf::Color greyscale(0, 0, 0, 255);
    sf::Color newPixelColor;

    sf::RenderWindow window(sf::VideoMode(image.getSize().x, image.getSize().y), "Image manipulation");
    sf::Texture imageTexture;
    imageTexture.loadFromImage(image);

    sf::RectangleShape picture;

    picture.setSize(sf::Vector2f((float)image.getSize().x, (float)image.getSize().y));
    picture.setTexture(&imageTexture);

    sf::Event event;

    while (window.isOpen())
    {
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
            {
                window.close();
            }
        }

        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Space))
        {
            for (int x = 0; x < image.getSize().x; x++) {
                for (int y = 0; y < image.getSize().y; y++) {
                    if(x > (image.getSize().x) / 2) {
                        int newPixel = image.getPixel(x, y).r;
                        newPixel = image.getPixel(x, y).g;
                        newPixel = image.getPixel(x, y).b;

                        newPixelColor.r = newPixel;
                        newPixelColor.g = newPixel;
                        newPixelColor.b = newPixel;

                        image.setPixel(x, y, newPixelColor);
                    }
                }
            }
            imageTexture.loadFromImage(image);
        }
        window.clear();
        window.draw(picture);
        window.display();
    }
    return 0;
}`

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

SFML на самом деле не предназначен для манипуляций с изображениями или попиксельных вычислений (вне шейдеров).Для этого есть гораздо больше оптимизированных библиотек, например OpenCV.

Если вы хотите рисовать части изображения, отражать их и т. Д., Вам следует просто полагаться на использование sf::Sprite или (вероятно, лучше) asf::VertexArray.Вы можете просто манипулировать прямоугольником текстуры или координатами текстуры, чтобы отразить или настроить части, которые вы хотите отобразить.

Для этого примера я использую это изображение Зебры . * 1009, являющееся общественным достоянием.*

Мой пример кода не требует пояснений, поэтому я не думаю, что он нуждается в дополнительном объяснении:

#include <SFML/Graphics.hpp>
#include <vector>

int main()
{
    sf::RenderWindow window({1280, 853}, "Zebra");
    sf::Texture texZebra;
    texZebra.loadFromFile("zebra.jpg");

    sf::VertexArray zebra(sf::Quads);

    // Every vertex is defined by a world coordinate, color, and texture coordinate

    // Define the first quad (left half)
    zebra.append({{0, 0},     sf::Color::White, {0, 0}});
    zebra.append({{640, 0},   sf::Color::White, {640, 0}});
    zebra.append({{640, 853}, sf::Color::White, {640, 853}});
    zebra.append({{0, 853},   sf::Color::White, {0, 853}});

    // Define the right quad (right half)
    zebra.append({{640, 0},     sf::Color::White, {640, 0}});
    zebra.append({{1280, 0},   sf::Color::White, {0, 0}});
    zebra.append({{1280, 853}, sf::Color::White, {0, 853}});
    zebra.append({{640, 853},   sf::Color::White, {640, 853}});

    while (window.isOpen()) {
        sf::Event event;
        while (window.pollEvent(event)) {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        sf::RenderStates state;
        state.texture = &texZebra;
        window.draw(zebra, state);
        window.display();
    }
}

После запуска вы увидите окно, отображающее левую половинуисходное изображение, зеркальное отображение в середине:

Example Screenshot

0 голосов
/ 02 октября 2018

так что для тех, кто хочет ответа.Измените y с помощью x и x с помощью y, и вы получите то, что я искал!

int halfHeight = image.getSize().y / 2;

for (int y = 0; y < halfHeight; y++)
{
    for (int x = 0; x < image.getSize().x; x++)
    {
        image.setPixel(x, image.getSize().y - 1 - y, image.getPixel(x, y));
    }
}
...