正常图片是下面这样的:

用Texture2D渲染元数据不对,后用Image保存到本地是下面这样的:

获取rgba8888元数据代码
int argb_bitsperpixel = 32;//一个像素用几位表示
int argb_bytesperpixel = argb_bitsperpixel/8;//一个像素在几个字节的存储空间
int argb_stride_argb = _width * argb_bytesperpixel;
int argb_length = (_width * _height * argb_bytesperpixel);
uint8* dst_argb = (uint8* )calloc(argb_length, sizeof(uint8));
int res = libyuv::I420ToARGB(_yBuffer, _yStride, _uBuffer, _uStride, _vBuffer, _vStride, dst_argb, argb_stride_argb, _width, _height);
if (res == 0) {
// NSLog(@"成功");
}
// int rgb_bitsperpixel = 24;//一个像素用几位表示
// int rgb_bytesperpixel = rgb_bitsperpixel/8;//一个像素在几个字节的存储空间
// int rgb_stride_rgb = _width * rgb_bytesperpixel;
// int rgb_length = (_width * _height * rgb_bytesperpixel);
int rgba_bitsperpixel = 32;//一个像素用几位表示
int rgba_bytesperpixel = rgba_bitsperpixel/8;//一个像素在几个字节的存储空间
int rgba_stride_rgb = _width * rgba_bytesperpixel;
int rgba_length = (_width * _height * rgba_bytesperpixel);
uint8* dst_rgb = (uint8* )calloc(rgba_length, sizeof(uint8));
libyuv::ARGBToRGBA(dst_argb, argb_stride_argb, dst_rgb, rgba_stride_rgb, _width, _height);
[[AgoraManager share] nitificationWithUid:_uid rgbaBuffer:dst_rgb rgbsStride:rgba_stride_rgb dataLen:rgba_length width:_width height:_height rotation:_rotation];
更新图片代码:
void HelloWorld::updateFrame(unsigned int uid, const void *data, ssize_t dataLen, int pixelsWide, int pixelsHigh) {
void *datas = calloc(dataLen, sizeof(unsigned char));
std::memcpy(datas, data, dataLen);
Image *image = new Image();
image->initWithRawData((const unsigned char *)datas, dataLen, pixelsWide, pixelsHigh, 8);
std::string path = FileUtils::getInstance()->getWritablePath() + "a.png";
image->saveToFile(path);
Texture2D *texture = new Texture2D;
// bool res = texture->initWithData(data, dataLen, Texture2D::PixelFormat::RGBA8888, pixelsWide, pixelsHigh, Size(pixelsWide, pixelsHigh));
bool res = texture->initWithImage(image);
if (res) {
Sprite* sprite = _headers.at(uid);
if (sprite == NULL) {
sprite = createSpiteWithTexture(texture);
this->addChild(sprite, 0);
_headers.insert(uid, sprite);
this->updateHeadersDisplay();
} else {
sprite->setTexture(texture);
}
}
CC_SAFE_RELEASE(texture);
CC_SAFE_RELEASE(image);
// free(datas);
}