【问题标题】:How to decode raw png data from Assimp to CGImage?如何将原始 png 数据从 Assimp 解码为 CGImage?
【发布时间】:2018-02-05 21:28:03
【问题描述】:

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

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

我知道pcData 将包含 png 标头、块等,libPNG 可以将实际图像数据与其他规格(宽度、高度等)返回给我。

什么是原生 iOS/macOS API 来代替libPNG 例如:CGImageCreateWithPNGDataProvider source 属性将其描述为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);

【问题讨论】:

    标签: cgimage assimp


    【解决方案1】:

    好吧,至少对于 iOS/macOS; assimp 库似乎有问题。

    以下,如果不是完美的修复,工作:

    添加uint_8 以在texture.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.

    【讨论】:

      猜你喜欢
      • 2019-03-24
      • 2010-11-24
      • 2012-05-11
      • 1970-01-01
      • 2014-06-14
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多