2009-07-03 7 views
1

указатель данные если указывать на какое-либо изображение, созданное приложением iphone. Кто-нибудь теперь, если использует CGBitmapContextCreate, копирует эти данные или использует изображение «на месте»?iphone: создание изображения без выделения новой памяти

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

void* data = <my data>; 

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
CGContextRef imageContext = CGBitmapContextCreate(data, w, h, 8, w*8, colorSpace, kCGBitmapByteOrder32Big|kCGImageAlphaPremultipliedLast); 
CGImageRef imageRef = CGBitmapContextCreateImage(imageContext); 
UIImage* image =[[UIImage alloc] initWithCGImage:imageRef]; 

В целом, этот способ создания изображения кажется мне довольно запутанным. Кто-нибудь знает, что здесь происходит? Есть ли более простой способ создать UIImage?

Благодаря

ответ

1

А что-то вроде этого:

void * data = <my data>; 
NSData * newData = [NSData dataWithBytesNoCopy:data length:lengthOfData]; 
UIImage * image = [[UIImage alloc] initWithData:newData]; 
+2

- [UIImage initWithData] декодирует данные изображения и в процессе делает его копию. Чтобы по-настоящему создать изображение без выделения памяти, единственный способ состоит в том, чтобы данные были предварительно закодированы в формате пикселей, который поддерживает iPhone с помощью копирования-на-записи и использует CGBitmapContextCreate – rpetrich

+0

На самом деле я не мог заставить это работать правильно ... Как сделать Я передаю информацию о формате и размере в UIImage? Наверняка чего-то там нет. – 2009-11-30 16:48:22

2

От here это выглядит как CGBitmapContextCreate будет использовать только память, который вы передаёте в Но данные могут быть скопированы вызовом CGBitmapContextCreateImage,

.

Apple, документы:

Обсуждение C Объект GImage возвращен от CGBitmapContextCreateImage создается копией . Последующие изменения графического контекста не влияют на содержимое возвращаемого изображения . В некоторых случаях операция копирования на самом деле следует копирование при записи семантике, поэтому , что фактическая физическая копия бит происходить только тогда, когда основные данные в битовой карте графического контекста изменены. Как следствие, вы можете хотите использовать результирующее изображение и отпустите его перед выполнением дополнительный чертеж в растровое изображение графический контекст. Таким образом, вы можете избежать фактической физической копии данных .