cocos2d-x版本:3.16
我想捕获屏幕区域,并将其保存在PNG文件中。最好的方法是使用RenderTexture
,并使用方法setVirtualViewport
捕获特定区域。文档说:
void setVirtualViewport ( const Vec2 & rtBegin, const Rect & fullRect, const Rect & fullViewport )
用于抓取屏幕的一部分到纹理。
参数
rtBegin
renderTexture在fullRect上的位置。fullRect
屏幕的总大小。fullViewport
总viewportSize。
我有以下代码,设计分辨率为1920 * 1080(我简化了代码以在此处显示,并将值作为常量):
unsigned int SIZE_X = 960;
unsigned int SIZE_Y = 540;
unsigned int POS_X = 100;
unsigned int POS_Y = 100;
RenderTexture* texture = RenderTexture::create(SIZE_X, SIZE_Y);
texture->setVirtualViewport(Vec2(POX_X, POS_Y),
Rect(0, 0, 1920, 1080),
Rect(0, 0, SIZE_X, SIZE_Y));
texture->begin();
this->visit();
texture->end();
texture->saveToFile("test.png", Image::Format::PNG);
我已经尝试了很多不同的参数组合,但无论我做什么,最多都会捕获矩形0,0,SIZE_X,SIZE_Y中的像素,其余部分用透明像素填充。此外,偏移是错误的(它受到屏幕尺寸和捕获区域之间的比率的影响,但它不应该)。
以下是模型场景的上述代码的结果,其中红色表示透明像素:
我以红色显示的所有像素都是空的,它们不应该是,并且偏移是错误的:(50, 50)
而不是(100, 100)
。
您知道如何正确使用setVirtualViewport
吗?他们的方法中是否有错误或我做错了什么?
或者,您是否有其他解决方案来捕获屏幕区域并将其保存为图像或cocos2d::Sprite
? (不移动Scene
)的内容
答案 0 :(得分:0)
由于我似乎无法确切了解函数setVirtualViewport
是如何工作的,或者这个函数可能存在问题,因此我提出了一个解决方案,它也是如此事情,即使它可能效率不高:
RenderTexture
。Sprite
生成的RenderTexture
的位置,即使它不属于该场景,因此不可见,也可以将其设置为你想要的区域(0,0)。RenderTexture
。RenderTexture
。以下是代码:
unsigned int SIZE_X = 960;
unsigned int SIZE_Y = 540;
unsigned int POS_X = 100;
unsigned int POS_Y = 100;
RenderTexture* screenCapture = RenderTexture::create(1920, 1080);
screenCapture->begin();
this->visit();
screenCapture->end();
RenderTexture* areaTexture = RenderTexture::create(SIZE_X, SIZE_Y);
areaTexture->begin();
screenCapture->getSprite()->setPosition(Vec2(960 - POS_X, 540 - POS_Y));
screenCapture->getSprite()->visit();
areaTexture->end();
AreaTexture->saveToFile("test.png", Image::Format::PNG);