我正在使用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}}
答案 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);
}