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();
}
}
После запуска вы увидите окно, отображающее левую половинуисходное изображение, зеркальное отображение в середине: