2010-11-28 3 views
1

У меня есть задача программирования для приложения, которое я пишу для iPad, и в документации не ясно, как это сделать. Я надеюсь на хороший совет по решению этой проблемы.Динамический рендеринг изображений на iOS

В принципе, у меня есть буфер памяти, в котором хранится необработанный RGB для изображения размером 256x192 пикселей. Это изображение будет записано на регулярной основе, и я хочу отобразить это на области с разрешением 768x576 на экране при вызове обновления. Я бы хотел, чтобы это было относительно быстро и, возможно, оптимизировало его, обработав только те области изображения, которые действительно меняются.

Как бы я это сделал? Моя первоначальная мысль - создать CGBitmapContext для управления изображением 256x192, затем создать CGImage, затем создать UIImage из этого и изменить свойство изображения экземпляра UIImageView. Это звучит довольно медленный процесс.

Я нахожусь на правильных линиях или должен смотреть на что-то другое. Другое замечание состоит в том, что этот образ должен сосуществовать с другими представлениями UIKit на экране.

Спасибо за любую помощь, которую вы можете предоставить.

ответ

2

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

Если вы используете контекст растрового изображения, вы должны обязательно добавить альфа-канал (RGBA или ARGB), так как CGBitmapContext не поддерживает только RGB.

1

ОК, я придумал решение. Спасибо Justin за то, что он дал мне уверенность в использовании растровых контекстов. В конце концов, я использовал этот кусок кода:

CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault; 
CFDataRef data = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, (UInt8*)screenBitmap, sizeof(UInt32)*256*192, kCFAllocatorNull); 
CGDataProviderRef provider = CGDataProviderCreateWithCFData(data); 
CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB(); 

CGImageRef image = CGImageCreate(256, 192, 8, 32, sizeof(UInt32)*256, colourSpace, bitmapInfo, provider, 0, NO, kCGRenderingIntentDefault); 

CGColorSpaceRelease(colourSpace); 
CGDataProviderRelease(provider); 
CFRelease(data); 

self.image = [UIImage imageWithCGImage:image]; 

CGImageRelease(image); 

отметить также, что screenBitmap моего UInt32 массив размера 256x192, а сам это UIImageView полученного объекта. Этот код работает хорошо, но правильно ли он это делает?

+0

Да. Если у вас нет необходимости в функциях рисования CoreGraphics, это будет делать это и совершенно правильно. – 2010-11-28 07:39:50

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