Я ищу оптимизацию процедуры, которая извлекает данные пикселя из CGImage. То, как это делается в настоящее время (очень неэффективно), - это создать новый CGContext, нарисовать CGImage в контексте и затем получить данные из контекста.Получение данных пикселов из CGImageRef содержит дополнительные байты?
У меня есть следующая оптимизированная процедура для обработки этого:
CGImageRef imageRef = image.CGImage;
uint8_t *pixelData = NULL;
CGDataProviderRef imageDataProvider = CGImageGetDataProvider(imageRef);
CFDataRef imageData = CGDataProviderCopyData(imageDataProvider);
pixelData = (uint8_t *)malloc(CFDataGetLength(imageData));
CFDataGetBytes(imageData, CFRangeMake(0, CFDataGetLength(imageData)), pixelData);
CFRelease(imageData);
Это почти работает. После просмотра и сравнения шестнадцатеричного дампа данных пикселя, полученного с помощью обоих методов, я обнаружил, что в приведенном выше случае имеется 8 байтов из 0 каждый 6360 байт. В противном случае данные идентичны. например
А вот сравнение с неоптимизированной версией:
После 8 байт 0, правильные пиксельные данные продолжаются. Кто-нибудь знает, почему это происходит?
UPDATE: Вот процедура я оптимизация (отрезал код просто получить информацию о размере и других не важные вещи, соответствующий бит возвращаются пиксельные данные):
CGContextRef context = NULL;
CGImageRef imageRef = image.CGImage;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst;
// ... SNIP ...
context = CGBitmapContextCreate(...);
CGColorSpaceRelease(colorSpace);
// ... SNIP ...
CGContextDrawImage(context, rect, imageRef);
uint8_t *pixelData = (uint8_t *)CGBitmapContextGetData(context);
CGContextRelease(context);
Очевидно, что это является чрезмерным объемом работы только для получения базовых данных пикселя. Создание контекста, а затем рисование в нем. Первая процедура находится в 5-10 раз быстрее. Но, как я уже указывал, данные пикселей, возвращаемые обеими процедурами, почти идентичны, за исключением того, что в оптимизированном коде (выделенном на изображениях) вставлено 8 нулевых байтов каждые 6360 байт.
В противном случае, все остальное же - цветовые значения, порядок байт и т.д.
Непонятно, как вы получили эти два разных пиксельных буфера и то, что квалифицирует их как «оптимизированных», а другое «неоптимизированное». Я не понимаю, почему вы проходите этот процесс, который вы описываете. Либо яснее расскажу, как вы получили эти два пиксельных буфера, либо просто скажите нам, что вы пытаетесь сделать. – Rob
@Rob См. Обновление выше. Я перехожу к процессу, чтобы получить базовые данные пикселя из CGImage, чтобы передать его настраиваемому механизму рендеринга, который работает с отдельными пикселями. – Chris
Я хочу сказать, что если вы хотите получить базовые данные пикселя для изображения, вам не нужно проходить этот процесс кругового отключения. (Этот процесс, однако, полезен при работе с гетерогенными форматами изображений, и вы хотите получить его в одном согласованном формате.) В ответ на вопрос, почему у вас есть дополнительные байты, я бы сделал ставку на то, что 'CGImageGetBytesPerRow' для двух вернется разные значения. – Rob