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

在进行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就可以了


(纯属自己个人观点,能力有限,可能有错误的地方,希望各位指点)






猜你喜欢

转载自blog.csdn.net/qq_36220729/article/details/53256501
今日推荐