C++ 镜像半个图像c++;

C++ 镜像半个图像c++;,c++,sfml,C++,Sfml,所以我试着镜像一个图像,虽然只有一半,所以我的图像(斑马)只有两个屁股或两个脑袋,不管是哪一个。 我用下面的代码对图片的一半进行了灰度处理。 我该如何镜像它,而不是使其变为灰色 int main() { sf::Image image; image.loadFromFile("../Images/zebra.bmp"); sf::Color greyscale(0, 0, 0, 255); sf::Color newPixelColor; sf::Re

所以我试着镜像一个图像,虽然只有一半,所以我的图像(斑马)只有两个屁股或两个脑袋,不管是哪一个。 我用下面的代码对图片的一半进行了灰度处理。 我该如何镜像它,而不是使其变为灰色

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;
}`
intmain()
{
sf::图像;
image.loadFromFile(“../Images/zebra.bmp”);
彩色灰度(0,0,0,255);
sf::颜色新像素颜色;
sf::RenderWindow窗口(sf::VideoMode(image.getSize().x,image.getSize().y),“图像处理”);
sf::纹理图像纹理;
imageTexture.loadFromImage(图像);
矩形图形;
设置大小(sf::Vector2f((float)image.getSize().x,(float)image.getSize().y));
picture.setTexture(&imageTexture);
sf::事件;
while(window.isOpen())
{
while(window.pollEvent(事件))
{
如果(event.type==sf::event::Closed)
{
window.close();
}
}
如果(sf::Keyboard::isKeyPressed(sf::Keyboard::Space))
{
对于(int x=0;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=新像素;
newPixelColor.g=新像素;
newPixelColor.b=新像素;
设置像素(x,y,newPixelColor);
}
}
}
imageTexture.loadFromImage(图像);
}
window.clear();
窗。画(画);
window.display();
}
返回0;
}`

对于那些想要答案的人来说也是如此。用x换y,用y换x,你就会得到我想要的

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));
    }
}
int halfHeight=image.getSize().y/2;
对于(int y=0;y
SFML并不是真正用于图像处理或逐像素计算(外部着色器)。有更多的优化库,例如OpenCV

如果您想绘制图像的一部分,请镜像它们,等等。您应该只使用
sf::Sprite
或(可能更好)使用
sf::VertexArray
。只需操纵纹理矩形或纹理坐标即可镜像或调整要显示的零件

对于我使用的这个例子

我的示例代码非常简单,因此我不认为它需要太多额外的解释:

#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();
    }
}
#包括
#包括
int main()
{
渲染窗口({1280853},“斑马”);
斑马;
texZebra.loadFromFile(“zebra.jpg”);
四头斑马;
//每个顶点都由世界坐标、颜色和纹理坐标定义
//定义第一个四边形(左半部分)
append({0,0},sf::Color::White,{0,0});
zebra.append({640,0},sf::Color::White,{640,0});
zebra.append({640853},sf::Color::White,{640853});
zebra.append({0853},sf::Color::White,{0853});
//定义右四边形(右半部分)
zebra.append({640,0},sf::Color::White,{640,0});
zebra.append({1280,0},sf::Color::White,{0,0});
zebra.append({1280853},sf::Color::White,{0853});
zebra.append({640853},sf::Color::White,{640853});
while(window.isOpen()){
sf::事件;
while(window.pollEvent(事件)){
如果(event.type==sf::event::Closed)
window.close();
}
sf::RenderStates状态;
state.texture=&texZebra;
画(斑马,州);
window.display();
}
}
运行后,将出现一个窗口,显示原始图像的左半部分,中间镜像:


问题是什么?我应该如何镜像图像,而不是将图像的一半变成灰色