Как декодировать необработанные данные 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
? Например: 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);
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);
}