如题:cocos2dx的截图功能如何截取屏幕的一部分?用CCRenderTexture它的create函数前两个参数设置的宽度和高度,截出来的图片都是从屏幕的左下角开始算起,如果我想截取屏幕的中间的内容就不行了,在网上看了下说用saveBuffer这个函数,但是在CCRenderTexture这个类没有这个函数,只有saveToFile这个函数,这怎么弄啊?请高人指点一下。
我也遇到过,但是目前还是有几个参数不清楚 要调用CCRenderTexture里的函数
void Director::saveScreenshot(const std::string& fileName,const std::function<void(const std::string&)>& callback){
Image::Format format;
if(std::string::npos != fileName.find_last_of(".")){
auto extension = fileName.substr(fileName.find_last_of("."),fileName.length());
if (!extension.compare(".png")) {
format = Image::Format::PNG;
} else if(!extension.compare(".jpg")) {
format = Image::Format::JPG;
} else{
CCLOG("cocos2d: the image can only be saved as JPG or PNG format");
return;
}
} else {
CCLOG("cocos2d: the image can only be saved as JPG or PNG format");
return ;
}
auto origin=Director::getInstance()->getVisibleOrigin();
RenderTexture *renderTexture = RenderTexture::create(getWinSize().width, getWinSize().height*0.88, Texture2D::PixelFormat::RGBA8888);
Rect fullRect;
fullRect.setRect(origin.x,origin.y+getWinSize().height*0.18,getWinSize().width,getWinSize().height*0.7);
Rect virtualViewPort;
virtualViewPort.setRect(origin.x,origin.y+getWinSize().height*0.4,getWinSize().width,getWinSize().height*0.95);
renderTexture->setVirtualViewport(Point(origin.x,origin.y+getWinSize().height*0.325),fullRect,virtualViewPort);
renderTexture->beginWithClear(0.0f, 0.0f, 0.0f, 0.0f);
Director::getInstance()->getRunningScene()->visit();
renderTexture->end();
renderTexture->saveToFile(fileName , format);
auto fullPath = FileUtils::getInstance()->getWritablePath() + fileName;
auto scheduleCallback = &,fullPath,callback](float dt){
callback(fullPath);
};
auto _schedule = Director::getInstance()->getRunningScene()->getScheduler();
_schedule->schedule(scheduleCallback, this, 0.0f,0,0.0f, false, "screenshot");
}
给你参考下,反正我是部分截图
最重要的是这句 renderTexture->setVirtualViewport(Point(origin.x,origin.y+getWinSize().height*0.325),fullRect,virtualViewPort);
谢谢你,明天试下看看
不对啊,你这是3.0以上版本的吧?我用的是2.2.3的,没有这个函数啊,晕
这是自己写的,在director里的类自己写
你说的是没有哪个函数?
没有这个函数renderTexture->setVirtualViewport(Point(origin.x,origin.y+getWinSize().height*0.325),fullRect,virtualViewPort);
我也遇到同样的问题,我的方法比较傻瓜,用得到的全屏截图的一部分RECT创建精灵,然后在visit该精灵。我是在quick里面做的,代码可以参考下:
local size = cc.Director:getInstance():getWinSize()
local render1 = cc.RenderTexture:create(size.width, size.height)
local runningScene = cc.Director:getInstance():getRunningScene()
render1:beginWithClear(0,0,0,0,0)
runningScene:visit() --访问整个场景
render1:endToLua()
local render2 = cc.RenderTexture:create(size.width, size.height/2)
--以render1的texture创建精灵,rect即为所需要的截图部分
local tempSp = cc.Sprite:createWithTexture(render1:getSprite():getTexture(), cc.rect(0, size.height * 0.5, size.width, size.height * 0.5))
tempSp:setAnchorPoint(0, 0)
tempSp:setPosition(0, 0)
tempSp:setFlippedY(true)
render2:beginWithClear(0,0,0,0,0)
tempSp:visit() --访问精灵
render2:endToLua()
local pathsave = "share.png"
if render2:saveToFile('share.png', 0) == true then --render2保存为文件
print(pathsave)
end
我碰到的可能也是这个问题
local pRT = cc.RenderTexture:create(150, 50); --创建渲染纹理对象,并确定宽度
pRT:begin()
local rect=CCRect(26,0,52,50);
temp:setTextureRect(rect)
temp:visit()
rect=CCRect(0,0,52,50)
temp2:setTextureRect(rect)
temp2:setPosition(cc.p(10,0))
temp2:visit()
pRT:endToLua()
单个sprite只会渲染最后的位置,所以我用了多个sprite解决
你这截屏后屏幕上的图像显示会变化,3.0测试
请问renderTexture->setVirtualViewport(Point(origin.x,origin.y+getWinSize().height*0.325),fullRect,virtualViewPort);
这个函数什么作用啊,
我是先截取整个屏幕,得到截取的Sprite, 这个Sprite->setTextureRect截取你想要的区域,
然后这个Sprite->setPosition(sp->getContentSize()/2);
再创建个RenderTexture visit这个Sprite