具有特定颜色的像素不在 SFML 中放置的位置

pixel with specyfic color is not in the position it was put in SFML

本文关键字:SFML 位置 像素 颜色      更新时间:2023-10-16

我希望有可能将图像加载到窗口中,然后读取特定像素,更改其颜色,最后将像素放入其他内容。不幸的是,读取像素不起作用:

#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;
            }
        }
    }
}

我不知道为什么我放它的同一个地方的读取颜色是 0、0、0。奇怪的是,有效颜色位于我放置的位置下方:

    readColor = getPixelColor(screen, x, y-1); // it is valid colour
    printColor(readColor);

这可能是某种肮脏的解决方案,但有时我需要从位置 y=0 读取像素,所以在这种情况下,我的黑客不起作用。

我目前的SFML版本是Windows 7上的SFML-2.4.2 gcc-4.9.2-tdm-32位

我试图用一个例子来回答这个问题。我认为您可以在此基础上构建解决方案。我将图像加载到精灵的纹理中,然后读取特定的像素并更改其颜色。我不明白的是,你写了"终于把像素放了别的东西"。显然我无法回答这个问题。

当你执行这个函数时,你会在10、10处看到一个小的绿色像素。希望这有帮助。

#include <iostream>
using namespace std;
#include <SFML/Graphics.hpp>
sf::Color setPixelColor(sf::Texture& texture, int x, int y, sf::Color color){
  // Get texture image
  sf::Image image = texture.copyToImage();
  // Optional show case: read size of image (not used in this function)
  int width = image.getSize().x;
  int height = image.getSize().y;
  // Get color of specific position
    sf::Color imagecolor = image.getPixel(x, y);
  // Just an example: if alpha is above 128, make it green
  if (imagecolor.a > 128){
    imagecolor.g = 255;
  }
  // Set pixel to color
  image.setPixel(x, y, color);
  // Update texture
  texture.loadFromImage(image);
}
int main(){
  sf::RenderWindow screen(sf::VideoMode(900, 600), "window");
  sf::Sprite background;
  sf::Texture texture;
  if (!texture.loadFromFile("background.png")){
     cout << "Error loading texture" << endl;
  }
  background.setTexture(texture);
  while (screen.isOpen()){
    sf::Event event;
    while (screen.pollEvent(event)){
      if (sf::Event::Closed == event.type){
        screen.close();
        break;
      }
    }
    setPixelColor(texture, 10, 10, sf::Color::Green);
    screen.clear();
    screen.draw(background);
    screen.display();
  }
}