gpt4 book ai didi

c++ - 具有特定颜色的像素不在它在 SFML 中的位置

转载 作者:行者123 更新时间:2023-11-28 04:58:00 25 4
gpt4 key购买 nike

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

#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 读取像素,所以在这种情况下我的 hack 不起作用。

我当前的 SFML 版本是 SFML-2.4.2 gcc-4.9.2-tdm-32-bit 在 Windows 7 上

最佳答案

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

当您执行此函数时,您会在 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();
}
}

关于c++ - 具有特定颜色的像素不在它在 SFML 中的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46754875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com