ios - быстрый способ получения RGB-данных из UIImage(фотобиблиотека)



objective-c opengl-es (1)

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

  • получить 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);

Ты мало что можешь сделать, но я, если найду способ, я буду рад услышать об этом.

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

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

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

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





alasset