Je veux avoir la possibilité de charger l'image dans la fenêtre, puis lire un pixel spécifique, changer sa couleur et enfin mettre le pixel autre chose. Malheureusement, la lecture pixels ne fonctionne pas:pixel avec la couleur specyfic n'est pas dans la position où il a été mis en SFML
#include <iostream>
using namespace std;
#include <SFML/Graphics.hpp>
#include <SFML/config.hpp>
inline bool isOnScreen(const sf::RenderWindow& screen, int x, int y)
{
return 0 <= x && x < screen.getSize().x && 0 <=y && y < screen.getSize().y;
}
void setPixelColor(sf::RenderWindow& screen, int x, int y, const sf::Color& color)
{
if (isOnScreen(screen, x, y))
{
sf::Vertex vertex(sf::Vector2f(x, y), color);
screen.draw(&vertex, 1, sf::Points);
}
else
{
cerr << "point " << x << ", " << y << " out of screen, which is: " << screen.getSize().x << ", " << screen.getSize().y << "!\n";
}
}
sf::Color getPixelColor(sf::RenderWindow& screen, int x, int y)
{
if (isOnScreen(screen, x, y))
{
return screen.capture().getPixel(x, y);
}
cerr << "Out of stage: " << x << ", " << y << endl;
return sf::Color::Transparent;
}
void printColor(const sf::Color& color)
{
cout << "Color: " << (int)color.r << ", " << (int)color.g << ", " << (int)color.b << '\n';
}
int main()
{
sf::RenderWindow screen(sf::VideoMode(900, 600), "window");
sf::Color myColor{255, 128, 0};
int x=10, y=10;
setPixelColor(screen, x, y, myColor);
auto readColor = getPixelColor(screen, x, y); // it is 0, 0, 0
printColor(readColor);
screen.display();
while (screen.isOpen())
{
sf::Event event;
while (screen.pollEvent(event))
{
if (sf::Event::Closed == event.type)
{
screen.close();
break;
}
}
}
}
Je ne sais pas pourquoi la couleur de lecture à partir du même endroit où j'ai mis son est 0, 0, 0. La chose étrange est que la couleur est valide en position en dessous de la position que j'ai mis son:
readColor = getPixelColor(screen, x, y-1); // it is valid colour
printColor(readColor);
il peut être une sorte de solution sale, mais parfois, je dois lire pixel de la position y = 0, donc dans cette situation mon bidouille ne fonctionne.
Ma version actuelle SFML est SFML-2.4.2 gcc-4.9.2-tdm-32 bits sur Windows 7