Ищете простой способ рисования пикселей в ios (iphone, ipad) - PullRequest
1 голос
/ 27 мая 2011

У меня простой вопрос про рисование.Я подготовил двумерный массив с анимированным волновым движением.Массив обновляется каждую 1/10 секунды (это может изменить пользователь).После обновления массива я хочу отобразить его в виде двухмерного изображения с каждым значением массива в виде пикселя с диапазоном цветов от 0 до 255.

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

Цените любую помощь в этом ...

KAS

1 Ответ

2 голосов
/ 27 мая 2011

Если это просто шкала серого, то должно работать следующее (закодировано как I, вероятно, стоит проверить на ошибки):

CGDataProviderRef dataProvider =
       CGDataProviderCreateWithData(NULL, pointerToYourData, width*height, NULL);

CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceGray();
CGImageRef inputImage = CGImageCreate(  width, height,
                                        8, 8, width, 
                                        colourSpace, 
                                        kCGBitmapByteOrderDefault,
                                        dataProvider,
                                        NULL, NO,
                                        kCGRenderingIntentDefault);
CGDataProviderRelease(dataProvider);
CGColorSpaceRelease(colourSpace);

UIImage *image = [UIImage imageWithCGImage:inputImage];
CGImageRelease(inputImage);

someImageView.image = image;

Это было бы для однократного отображения, предполагая, что вы не хотите писать собственный подкласс UIView (который стоит усилий, только если производительность, вероятно, является проблемой).

Насколько я понимаю из документов, провайдер данных может быть создан только один раз за время существования вашего буфера C. Я не думаю, что это верно для изображения, но если вы создали CGBitmapContext, чтобы обернуть ваш буфер, а не провайдера и изображение, это бы сохранялось, и вы могли бы использовать CGBitmapContextCreateImage, чтобы заставить CGImageRef двигаться дальше. Вероятно, стоит проверить в обоих направлениях, если это проблема.

РЕДАКТИРОВАТЬ: так что альтернативный путь будет:

// get a context from your C buffer; this is now something
// CoreGraphics could draw to...
CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceGray();
CGContextRef context = 
        CGBitmapContextCreate(pointerToYourData,
                              width, height,
                              8, width,
                              colourSpace,
                              kCGBitmapByteOrderDefault);
CGColorSpaceRelease(colourSpace);

// get an image of the context, which is something
// CoreGraphics can draw from...
CGImageRef image = CGBitmapContextCreateImage(context);

/* wrap in a UIImage, push to a UIImageView, as before, remember
   to clean up 'image' */

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

...