2014-11-04 3 views
1

Я хотел бы получить массив данных, содержащий представление RGB изображения, хранящегося в библиотеке фотографий (ALAset) на iOS (ios8 sdk). я уже попробовал этот метод:быстрый способ получить данные RGB от UIImage (фото библиотека)

  • получить в CGImage от ALAsset с [ALAssetRepresentation fullScreenImage]
  • привлечь CGImage к CGContext.

Этот метод работает, я получаю указатель на данные RGB, но это очень медленно (есть 2 преобразования). Конечная цель - быстро загрузить изображение в текстуре OpenGL.

Мой код, чтобы получить изображение из библиотеки фотографий

ALAsset* currentPhotoAsset = (ALAsset*) [self.photoAssetList objectAtIndex:_currentPhotoAssetIndex]; 
ALAssetRepresentation *representation = [currentPhotoAsset defaultRepresentation]; 
//-> REALLY SLOW 
UIImage *currentPhoto = [UIImage imageWithCGImage:[representation fullScreenImage]]; 

Мой код рисовать на CGContext:

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
NSUInteger bytesPerPixel = 4; 
NSUInteger bytesPerRow = bytesPerPixel * textureWidth; 
NSUInteger bitsPerComponent = 8; 
CGContextRef context = CGBitmapContextCreate(textureData, textureWidth, textureHeight, 
              bitsPerComponent, bytesPerRow, colorSpace, 
              kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 

CGColorSpaceRelease(colorSpace); 
//--> THAT'S REALLY SLOW 
CGContextDrawImage(context, CGRectMake(0, 0, textureWidth, textureHeight), cgimage); 
CGContextRelease(context); 

ответ

0

Существует не так много вы можете сделать, но я, если найти способ, которым я будем рады услышать об этом.

Дело в том, что вам нужно распаковать изображение (jpg, png ...), которое обычно делается путем создания CGImage (UIImage - это всего лишь обертка вокруг него). Но тогда вам не удастся получить указатель данных непосредственно с CGImage, но вам нужно скопировать их (очень медленный призыв к обращению). Хотя тогда, если размер и формат цели совпадают с исходными, эта операция должна быть довольно быстрой, поскольку данные должны быть скопированы более или менее просто. С другой стороны, если ваши textureWidth и textureHeight отличаются друг от друга, то размеры изображения, которые эти пиксели должны быть интерполированы, и эта функция может стать даже в несколько раз медленнее.

Единственный выход из этого, что я вижу, это получить библиотеку, чтобы непосредственно декомпрессировать изображение из файла и получить указатель на данные этого изображения. Но у меня не было проблемы с производительностью для загрузки текстур изображения (используйте фоновый поток).

В любом случае, если вы не делаете что-то подобное уже, как я использую это, чтобы получить размер изображения, а затем найдите ширину и высоту POT (мощность двух), которая заполняет размер изображения. Затем я создаю пустую текстуру с этими размерами POT и вызываю sub-образ, чтобы передать исходные данные изображения текстуре. Я использую собственный класс текстур для обработки этого, который также содержит (генерирует) текстурные координаты, поэтому правильная часть текстуры нарисована на буфер кадра. Затем этот класс расширяется для поддержки atlasing, который, как правило, вы хотите делать, когда имеете дело со многими изображениями (текстурами).

Я надеюсь, что эта информация вам поможет в любом случае ...

+0

Да Я буду использовать фоновый поток. Но другая проблема - память. Сначала я получил UIImage от ALAsset (10mb), а затем скопировал UIImage, чтобы получить данные RGB (10 Мб). Это может вызвать проблемы с давлением в памяти. – Nitenq