#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.. Я определил некоторые глобальные переменные, которые забыл сбросить. Еще одно напоминание мне о минимизации использования глобальных значений…