Карта распределения памяти UIImage

У меня есть a UIImage и я хотел бы поместить его данные в файл и и затем использовал отображаемый файл для сохранения некоторой памяти. По-видимому, UIImage данные являются частными, и не возможно получить доступ к нему. У Вас были бы какие-либо предложения для решения этого?

Спасибо!

6
задан Jacob Relkin 18 July 2010 в 04:03
поделиться

1 ответ

Если вы хотите отобразить в памяти закодированные данные изображения, выберите файл mmap и укажите ссылку на данные, передав CGDataProviderRef в CGImageCreate.

mapped = mmap( NULL , length , ... );
provider = CGDataProviderCreateWithData( mapped , mapped , length , munmap_wrapper );
image = CGImageCreate( ... , provider , ... );
uiimage = [UIImage imageWithCGImage:image];
...

Где munmap_wrapper выглядит примерно так:

// conform to CGDataProviderReleaseDataCallback
void munmap_wrapper( void *p , const void *cp , size_t l ) { munmap( p , l ); }

Если вы хотите отобразить в памяти фактические пиксели, вместо закодированных исходных данных, вы должны сделать что-то подобное с CGBitmapContext. Вы также должны создать поставщика и изображение, чтобы изображение ссылалось на те же пиксели, что и контекст. Все, что нарисовано в контексте, будет содержанием изображения. Ширина, высота, цветовое пространство и другие параметры должны совпадать для контекста и изображения.

context = CGBitmapContextCreate( mapped , ... );

В этом случае длина будет как минимум bytes_per_row * height байтов, поэтому файл должен быть не меньше этого размера.

Если у вас есть существующее изображение и вы хотите преобразовать пиксели в mmap, создайте контекст растрового изображения с размером и цветовым пространством вашего изображения и используйте CGContextDrawImage для рисования изображения в контексте.

Вы не указали источник вашего изображения, но если вы создаете его во время выполнения, было бы более эффективно создать его непосредственно в контексте растрового изображения. Любое создание изображения требует наличия растрового контекста за кулисами, поэтому с самого начала он может быть отображен в памяти.

8
ответ дан 16 December 2019 в 21:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: