iPhone - получить указатель на данные, стоящие за CGDataProvider? - PullRequest
2 голосов
/ 29 апреля 2010

Я пытаюсь взять CGImage и скопировать его данные в буфер для последующей обработки. Приведенный ниже код - это то, что у меня есть, но есть одна вещь, которая мне не нравится - это копирование данных изображения дважды. Один раз для CGDataProviderCopyData() и один раз для вызова :getBytes:length для imgData. Я не смог найти способ скопировать данные изображения прямо в мой буфер и вырезать шаг CGDataProviderCopyData(), но должен быть способ ... какие-нибудь указатели? (... каламбур)

NSData *imgData = (NSData *)(CGDataProviderCopyData(CGImageGetDataProvider(myCGImageRef)));

CGImageRelease(myCGImageRef);

// i've got a previously-defined pointer to an available buffer called "mybuff"
[imgData getBytes:mybuff length:[imgData length]];

Ответы [ 2 ]

1 голос
/ 30 апреля 2010

Смотрите этот ответ: Копирует ли CGDataProviderCopyData () байты? Или просто указатель?

Похоже, прямой доступ к буферу за CGDataProvider ограничен частными API.

0 голосов
/ 30 апреля 2010

Если вы не видите проблемы с производительностью при использовании инструментов для ее измерения, я не думаю, что копирование дважды - это огромная проблема. Вы всегда можете хранить CFDataRef imgData напрямую вместо mybuff.

Редактировать
Я говорю об этом виде кода:
В интерфейс вашего класса добавьте массив:

NSMutableArray *images;

В вашем init: метод: создайте массив:

images = [[NSMutableArray alloc] init];

и иметь сделку;

-(void)dealloc{
    [images release];
}

и в вашем коде, который сохраняет каждое изображение:

CGDataRef imageDataRef = CGDataProviderCopyData(CGImageGetDataProvider(myCGImageRef)));
[images addObject: (NSData*)imageDataRef];
CGRelease(imageDataRef);
...