如何解码从Assimp到CGImage的原始png数据?

时间:2017-08-28 14:56:07

标签: cgimage assimp

我正在使用Assimp,当使用带有嵌入纹理的FBX时,Assimp在以下struct aiTexture's pcData slot中提供嵌入的纹理数据。 pcData的文档说:

  

适当的解码器(例如libjpeg,libpng,D3DX,DevIL)是   需要加载这些纹理。 aiTexture :: mWidth指定大小   纹理数据的字节数,aiTexture :: pcData是指向的   原始图像数据

我知道pcData会有png标题,块等,libPNG可以返回实际的图像数据和其他规格(宽度,高度等)。

使用libPNG而不使用a data provider supplying PNG encoded data的原生iOS / macOS API是什么? 例如:CGImageCreateWithPNGDataProvider source属性将其描述为 CGDataProviderRef dataProvider = NULL; dataProvider = CGDataProviderCreateWithData(NULL, (const void*)texture->pcData, texture->mWidth, rgbReleaseRampData); if(dataProvider) { NSLog(@" ********* Created image data provider "); } // fails at this line CGImageRef imageRef = CGImageCreateWithPNGDataProvider(dataProvider, NULL,false, kCGRenderingIntentDefault); 。我尝试使用这样的代码,但这不起作用:

{{1}}

1 个答案:

答案 0 :(得分:0)

好吧,至少对于iOS / macOS;它似乎是assimp库的一个问题。

如果不是完美的解决方案,以下工作:

添加uint_8以保存texture.h中的原始图片数据:

uint8_t *rawImageData;

然后重新解释pcData中的FBXConverter.cpp

 out_tex->pcData = reinterpret_cast< aiTexel * >(const_cast<Video&>( video   
).RelinquishContent());
 out_tex->rawImageData = reinterpret_cast< uint8_t * >(out_tex->pcData);

解决了上述问题。如果不重新解释pcData,在iOS / macOS中会获得内存缓冲区的无效内存地址。

通过上述修复,生成图像对象只需要以下内容:

const struct aiTexture *aiTexture = aiScene->mTextures[index];
NSData *imageData = [NSData dataWithBytes:aiTexture->pcData
                                   length:aiTexture->mWidth];
self.imageDataProvider =
    CGDataProviderCreateWithCFData((CFDataRef)imageData);
NSString* format = [NSString stringWithUTF8String:aiTexture->achFormatHint];
if([format isEqualToString:@"png"]) {
    DLog(@" Created png embedded texture ");
    self.image = CGImageCreateWithPNGDataProvider(
        self.imageDataProvider, NULL, true, kCGRenderingIntentDefault);
}
if([format isEqualToString:@"jpg"]) {
    DLog(@" Created jpg embedded texture");
    self.image = CGImageCreateWithJPEGDataProvider(
        self.imageDataProvider, NULL, true, kCGRenderingIntentDefault);
}

The GH Issue.