2017-08-28 75 views
0

我使用的是Assimp,當使用嵌入紋理的FBX時,Assimp在以下struct aiTexture's pcData slot中提供嵌入的紋理數據。爲pcData文檔說:如何解碼從Assimp到CGImage的原始PNG數據?

適當的解碼器(如的libjpeg,libpng的,D3DX,魔鬼)需要 加載論文紋理。 aiTexture :: mWidth指定大小,以字節爲紋理數據的 ,aiTexture :: PCDATA是一個指針,指向 原始圖像數據

我明白pcData將具有標頭爲png,塊等和libPNG可以給我用其他規格(寬度,高度等)返回實際圖像數據。

什麼是原生iOS/macOS API來做到這一點,而不是使用libPNG 例如:CGImageCreateWithPNGDataProvidersource屬性描述爲a data provider supplying PNG encoded data。我試着用這樣的代碼,但這是行不通的:

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

回答

0

那麼,至少對於iOS/macOS;它似乎是assimp庫的問題。

下,如果沒有完美的修復,工作原理:

加入uint_8texture.h保持原始圖像數據:

uint8_t *rawImageData; 

FBXConverter.cpp然後重新詮釋pcData這樣:

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.