您的位置:首页 > 移动开发 > Cocos引擎

cc随笔:简单的自定义图片加密

2016-11-21 09:56 106 查看
在进行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就可以了

(纯属自己个人观点,能力有限,可能有错误的地方,希望各位指点)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐