Карта памяти UIImage - PullRequest
       5

Карта памяти UIImage

6 голосов
/ 18 июля 2010

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

Спасибо!

1 Ответ

8 голосов
/ 18 июля 2010

Если вы хотите отобразить в памяти закодированные данные изображения, затем отформатируйте файл и предоставьте ссылку на данные, передав 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 * высота байт, поэтому файл должен быть как минимум такого большого размера.

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

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

...