天天看點

讀取Jpg和mask圖檔

最近Dota傳奇比較火,小夥伴都在解剖它,然後發現它的UI不是png圖檔,而是jpg加上一個I8的png.看了下cocoachina論壇上有人釋出了一個讀取函數,可惜的是那個函數有點錯誤.是以自己寫了一個,在這裡mark一下.

Texture2D* FileIO::openImage(const char* jpgFile,const char* maskFile)
{
	std::string name = jpgFile;
	name.erase(name.length()-4,4);
	auto ret = Director::getInstance()->getTextureCache()->getTextureForKey(name);
	if(ret)
		return ret;
	auto _img = new Image();
	auto _jpg = new Image();
	auto _mask = new Image();
	do 
	{
		if(!_jpg->initWithImageFile(jpgFile))
			break;
		if(!_mask->initWithImageFile(maskFile))
			break;
		auto _color = _jpg->getData();
		auto _alpha = _mask->getData();
		auto _w = _jpg->getWidth();
		auto _h = _jpg->getHeight();
		auto _l = _jpg->getDataLen();
		auto _out = new unsigned char[_l*4];
		for(int idx = 0; idx < _l; idx++)
		{
			_out[idx*4]	  = _color[idx*3];
			_out[idx*4+1] = _color[idx*3+1];
			_out[idx*4+2] = _color[idx*3+2];
			_out[idx*4+3] = _alpha[idx];
		}
		_img->initWithRawData(_out,_l*4,_w,_h,4);
		ret = Director::getInstance()->getTextureCache()->addImage(_img,name);
		SAFE_DELETE(_out);
		break;
	} while (1);
	
	SAFE_DELETE(_img);
	SAFE_DELETE(_jpg);
	SAFE_DELETE(_mask);
	return ret;
}