在iOS上发现 CCTexture2D CCImage 渲染和保存,跟元数据图像内容对不上?

正常图片是下面这样的:

用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);
}