2009-10-02 4 views
2

Есть ли способ создать объект UIImage со стороны экрана без копирования базовых данных пикселей?Обмен памятью между CGImageRef и UIImage

Я хотел бы сделать что-то вроде этого:

// These numbers are made up obviously... 
CGContextRef offscreenContext = MyCreateBitmapContext(width, height); 

// Draw into the offscreen buffer 
// Draw commands not relevant... 

// Convert offscreen into CGImage 
// This consumes ~15MB 
CGImageRef offscreenContextImage = CGBitmapContextCreateImage(offscreenContext); 

// This allocates another ~15MB 
// Is there any way to share the bits from the 
// CGImageRef instead of copying the data??? 
UIImage * newImage = [[UIImage alloc] initWithCGImage:offscreenContextImage]; 

// Releases the original 15MB, but the spike of 30MB total kills the app. 
CGImageRelease(offscreenContextImage); 
CGContextRelease(offscreenContext); 

памяти освобождается и нивелирует на приемлемых размерах, но шип памяти 30MB является то, что убивает приложение. Есть ли способ поделиться данными с пикселями?

Я считал сохранение закадрового буфера в файл и снова загрузки данных, но это хак и удобные методы для iPhone требует UIImage, чтобы сохранить его ...

ответ

-2

Может

UIImage *newImage = [[UIImage alloc[ initWithData:offScreenContext]; 
+0

UIImage: initWithData принимает NSData * параметр, я не видел способ получить NSData * из CGImageRef или CGContextRef. – Shawn

+0

NSData поставляется с форматами изображений, такими как JPEG и PNG, с которыми вы взаимодействуете через initWithData - идя в другую сторону, вы получаете блоки NSData * из UIImage с вызовами PNGRepresentation и JPGRepresentation. Таким образом, это не поможет вам. –

0

Вы можете попробовать освободить контекст сразу после создания CGImage, освободив память, используемую контекстом, потому что CGBitmapContextCreateImage() создает копию контекста.

Как это:

CGImageRef offscreenContextImage = CGBitmapContextCreateImage(offscreenContext); 

CGContextRelease(offscreenContext); 

UIImage * newImage = [[UIImage alloc] initWithCGImage:offscreenContextImage]; 

// ... 

CGImageRelease(offscreenContextImage); 
+2

Вызов CGBitmapContextCreateImage - это то, что выделяет большой кусок памяти. Выпуск чего-либо там не должен влиять на инициализацию UIImage. Это не правильный ответ. Так что я попробовал что-то еще. Все мои предыдущие результаты были с SDK 3.0. Я скомпилировал с 3.1 SDK, и мои ассигнования пошли от устойчивого стабильного состояния 15 МБ с всплеском 30 МБ до стабильного состояния 2 МБ с шипом 6 МБ. Невероятно! Я вернулся и очистил обе версии, чтобы убедиться, что мои данные верны, и это было так. ObjectAlloc показал те же результаты. Похоже, что 3.1 SDK исправил некоторые проблемы с памятью. – Shawn

Смежные вопросы