把.pvr.ccz文件转换成png

时间:2024-03-10 10:50:28

我用的是一个万能转换法,原理是先用CCSprite加载.pvr.ccz,然后把它绘制到一个CCRenderTexture上,然后再保存到文件里。这方法其实不只.pvr.ccz文件,其他所有能被cocos2dx直接加载的文件都可以用这种转换。有个弊端就是可能跟源文件数据稍有些差异(我这个就是看起来有点白边)。

用法是:比如有个文件夹叫Image,里面有个文件叫1.pvr.ccz。把Image文件夹拖拽到PngConverter.exe图标上。然后会在Image的旁边生成一个文件夹叫Image_png(里面有个文件叫1.png)

注意:目录不能带中文!!!!

生成的png文件名字不全的bug已经修正。

点击下载

最近发现有些不道德行为,转载请注明出处:http://www.cnblogs.com/mrblue/p/3420189.html

附上关键源码

bool HelloWorld::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !CCLayer::init() )
    {
        return false;
    }
    
    CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
    CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();

    CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Arial", 24);

    // position the label on the center of the screen
    pLabel->setPosition(ccp(origin.x + visibleSize.width/2,
        origin.y + visibleSize.height - pLabel->getContentSize().height));
    this->addChild(pLabel, 1);

    {//convert
        const char* pszSuffix = ".pvr.ccz";

        int nStartPos = -1;
        while ( nStartPos=g_Param.find(\'\\\',nStartPos+1),-1!=nStartPos )
        {
            g_Param.replace(nStartPos,1,"/");
        }

        std::string strFileFilter = g_Param+"/*"+pszSuffix;

        _finddata_t fileDir;
        long lfDir;


        if((lfDir = _findfirst(strFileFilter.c_str(),&fileDir))==-1l)
        {
            char szMsg[128] = {0};
            sprintf(szMsg,"Please drag a folder which contains \"%s\" files onto this application\'s icon" ,pszSuffix);
            pLabel->setString(szMsg);
        }
        else
        {
            std::string strSaveFolderPath = g_Param+"_png/";

            BOOL ret = CreateDirectoryA(strSaveFolderPath.c_str(), NULL);
            if (!ret && ERROR_ALREADY_EXISTS != GetLastError())
            {
                CC_ASSERT(false);
            }

            int nFileNum = 0;
            do
            {
                std::string strFileName = fileDir.name;
                std::string strFilePath = g_Param+\'/\'+strFileName;

                CCSprite *img = CCSprite::create(strFilePath.c_str());
                img->setPosition(ccp(0,0));
                img->setAnchorPoint(ccp(0,0));
                CCSize sz = img->getContentSize();
                
                CCRenderTexture* pRT = CCRenderTexture::create(sz.width, sz.height, kCCTexture2DPixelFormat_RGBA8888);
                pRT->clear(1,1,1,0);
                pRT->begin();
                img->visit();
                pRT->end();

                std::string strSaveFile = strFileName.substr(0,strFileName.rfind(pszSuffix));
                strSaveFile+=".png";
                std::string strSaveFullPath = strSaveFolderPath+strSaveFile;

                CCImage *pImage = pRT->newCCImage(true);
                pImage->saveToFile(strSaveFullPath.c_str(), false);
                CC_SAFE_DELETE(pImage);

                CCLOG("%s",fileDir.name);
                
                nFileNum++;

            }while( _findnext( lfDir, &fileDir ) == 0 );

            char szMsg[128] = {0};
            sprintf(szMsg,"%d files have been converted",nFileNum);
            pLabel->setString(szMsg);
        }
    }


    return true;
}