在进行cocos 2dx 项目开发时,难免要考虑的一点就是,怕自己的作品被窃取,特别是图片,这里记录一下自己对图片简单的做一下加密工作。
因为能力有限,还不能像大牛些一样,写一个图片加密软件,这里我是直接在代码上实现的(其实大牛做的加密软件,其逻辑基本是相同的,只是加密的算法不同而已,我这里加密逻辑过于简单,只是做一下价单的插入工作而已):
1、选择一张图片,png、jpg、pvr等等;
ruiwen.png
2、代码实现加密:
bool recodeFileByName(string pFileName) { unsigned long nSize = 0; //获取图片的字节数组,并返回该文件的长度 unsigned char* pBuffer = FileUtils::getInstance()->getFileData( pFileName.c_str(), "rb", (ssize_t*)&nSize); //新建一个数组 unsigned char* newBuf = new unsigned char[nSize]; int newblen = nSize; //设置所要加密的字符串 unsigned char key[] = "jiamidekey"; if (pBuffer != NULL&&nSize > 0) { for (int i = 0; i < nSize; i++) { //遍历数组,对每一个字节进行加法处理,这里的加密算法可以自己定义 newBuf[i] = pBuffer[i] + key[i % 10]; } //获取文件名 string savepath = pFileName; //去除文件格式 savepath = savepath.substr(0, savepath.length() - 4); //如果该文件为png格式的 if (pFileName.find(".png") != std::string::npos) { //将该文件存储为.abc格式(这里可以自定义格式) savepath = savepath + ".abc"; } //打开文件 savepath(如:ruiwen.abc),这里如果不存在该文件,则会自动生成对应文件 FILE *fp = fopen(savepath.c_str(), "wb+"); //将数据写入文件中 fwrite(newBuf, 1, newblen, fp); //关闭 fclose(fp); return true; } }
3、在项目中找一个地方调用该方法,点击运行该项目:
运行成功后,可查看resourse目录下,多了一个.abc文件,该文件就是经过加密过了的图片
4、加密是可以了,但是怎样使用呢?接下来我们可以了解一下cocos 2dx 中的TextureCache是怎样实现的;
这里可以追中代码,发现在cocos 2dx 提供的源代码:
CCImage.cpp文件中存在
bool Image::initWithImageData(const unsigned char * data, ssize_t dataLen) { .................; _fileType = detectFormat(unpackedData, unpackedLen);//这里面需增加一个对.abc文件的判断方法,返回ABC格式 switch (_fileType) { case Format::PNG: ret = initWithPngData(unpackedData, unpackedLen); break; case Format::JPG: ret = initWithJpgData(unpackedData, unpackedLen); break; case Format::ABC://在这里可以新增对.abc格式的处理方法(怎样实现可以对照png或jpg格式来操作,步骤差不多的) ret = decrypt(unpackedData, unpackedLen); break; default: break; } if(unpackedData != data) { free(unpackedData); } } while (0); return ret; } bool Image::decrypt(const unsigned char* unpackedData, ssize_t unpackedLen) { bool ret = false; unsigned char* newBuf = new unsigned char[unpackedLen]; unsigned char key[] = "jiamidekey"; for (int j = 0; j < unpackedLen; j++) { newBuf[j] = unpackedData[j] - key[i % 10]; } if (isPng(newBuf, unpackedLen)) { _fileType = Format::PNG; ret = initWithPngData(newBuf, unpackedLen); } else if (isJpg(newBuf, unpackedLen)) { _fileType = Format::JPG; ret = initWithJpgData(newBuf, unpackedLen); } return ret; }
5、接下里就是在项目中使用了
直接调用:
TextureCache::getInstance()->addImage("ruiwen.abc");
或使用
spriteframecache就可以了
(纯属自己个人观点,能力有限,可能有错误的地方,希望各位指点)