Как декодировать необработанные данные PNG из Assimp в CGImage?

Я использую Assimp и при использовании FBX со встроенными текстурами Assimp предоставляет встроенные данные текстуры в следующей структуре aiTexture "s pcData слот Документация для pcData говорит:

Для загрузки текстур необходимы соответствующие декодеры (такие как libjpeg, libpng, D3DX, DevIL). 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);

1 ответ

Ну, по крайней мере, для 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);
}

Выпуск GH.

Другие вопросы по тегам