Ищу простой метод рисования пикселями в ios (iphone, ipad)

#ios #drawing #pixel

#iOS #рисование #пиксель

Вопрос:

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

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

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

KAS

Комментарии:

1. Как значения от 0 до 255 соотносятся с цветами? Это обычный метод в оттенках серого, или у вас есть целый спектр оттенков?

2. Томми.. Это было бы простое изображение серого оттенка, надеюсь, показывающее бегущую синусоидальную волну.

Ответ №1:

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

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

Комментарии:

1. Ты настоящий мужчина, Томми.. оба решения работают. Я использую первое решение, и на данный момент производительность достаточно приличная, поэтому я пока не беспокоюсь о подклассе UIView… Спасибо.

2. Томми… Как очистить последовательность анимации в UIImageView. Приведенные выше предложения по коду решили мои требования к анимации. Я загрузил фреймы в NSMutableArray и добавил их в UImageView. Эта часть работает действительно хорошо. Теперь я хочу остановить анимацию (которая является простой (ImageView.stopanimaiton ), однако, когда я загружаю новый массив изображений, я по-прежнему получаю старые изображения как часть новой последовательности. Я попытался удалить все объекты в изменяемом массиве и повторно инициализировать массив, но, похоже, не могу избавиться от старых изображений.

3. ОК .. неважно 🙂 Проблема не имела ничего общего с массивами UIViewImage.. Я определил некоторые глобальные переменные, которые забыл сбросить. Еще одно напоминание мне о минимизации использования глобальных значений…