2016-02-13 46 views
1

我想先说我是一个完整的C++新手。我不知道任何与它相关的词汇,所以如果这个问题很微不足道,我很抱歉,因为我现在没有正确的术语或短语来自己解决方案。旋转纹理sfml并保存输出到文件

当前玩这个代码我发现在github上从我的3ds捕获游戏。 https://github.com/Gotos/Cute3DSCapture/blob/master/main.cpp

我想添加旋转图像并将其保存到PNG文件的能力。

from main.cpp around 267我试图添加以下功能。

sprite.setTexture(texture); 
sprite.rotate(90); 
texture = sprite.getTexture(); 
texture.copyToImage().saveToFile("Something/Place/img.png"); 

当前纹理和精灵定义如下。

sf::Texture texture; 
sf::Sprite sprite; 

当我尝试建立并运行我得到的跟随着

main.cpp:269:25: error: no viable overloaded '=' 
       texture = sprite.getTexture(); 
       ~~~~~~~^~~~~~~~~~~~~~~~~~~~ 
/usr/local/include/SFML/Graphics/Texture.hpp:421:14: note: candidate function 
     not viable: no known conversion from 'const sf::Texture *' to 
     'const sf::Texture' for 1st argument; dereference the argument with * 
    Texture& operator =(const Texture& right); 

任何帮助将不胜感激。

+0

也许试试'sprite.getTexture() - > copyToImage()。saveToFile(“Something/Place/img.png”);'直接 – MiMo

+0

@MiMo这将简单地产生原始图像的副本,而不是修改版本。详情请参阅下面的答案。 – Hiura

回答

3

sf::Sprite不是纹理操纵器,这意味着sf::Sprite::getTexture()返回的纹理不会被修改。这就是为什么Sprite的ctor需要参考const纹理实例。

如果您对图像处理完全感兴趣,那么我建议您使用SFML以外的东西,因为您可能会针对特定操作获得更好的特性/性能。可能像imagemagick。

随着SFML,你能做到这大致是这样的:

  • 创建所需大小的RenderTexture - 可以把它作为给你访问它的纹理时.display()被称为虚拟窗口。
  • 使用您的初始纹理和某些操作(例如旋转)创建您的精灵 - 确保渲染纹理的大小正确设置为“显示”生成的图像
  • 在渲染纹理上绘制精灵并调用display()就可以了。
  • 然后您可以拨打sf::RenderTexture::getTexture()和链copyToImage()saveToFile()

有关使用示例,请参阅sf::RenderTexture的详细说明。

+0

谢谢,我删除了我的答案。我必须承认我几乎没有使用SFML,而且我没有读过'sf :: Sprite'文档。在我看来,在处理图像处理之前,OP有更多基本的东西需要学习! – Sam

+0

谢谢,我一般没有指针或引用的经验。我最初使用SFML是因为那是我在网上找到的与我的3ds采集软件兼容并能够快速输出图像的源代码。 我对OpenCV更熟悉,并且能够在那里操作图像。 http://docs.opencv.org/java/2.4.2/org/opencv/core/Core.html – Emre801