последовательное отображение нескольких изображений в цикле

#objective-c #image

#objective-c #изображение

Вопрос:

Я пытаюсь получить потоковое отображение в цикле. Насколько я понимаю, я мог бы, в принципе, зависнуть в программе, создав бесконечный цикл, связанный, скажем, с нажатием кнопки. В любом случае, когда я запускаю этот код, счетчик выполнения выводится просто отлично, и кадры с камеры записываются (я могу сохранить их в виде серии файлов.) Однако отображение с использованием setImage ничего не делает до конца цикла, когда на экране отображается последнее изображение. Мой вопрос заключается в следующем: если программа выполняется последовательно, как описано в документации, почему отображение не происходит, в то время как код на другой стороне команды отображения обрабатывается просто отлично? Является ли отображение просто «сброшенным» в параллельный процесс, и в этом случае я должен просто поместить цикл задержки в ожидании завершения отображения?

Спасибо WMW

 uint32 MaxRuns = 10;
for (uint32 NoRuns = 0 ; NoRuns < MaxRuns ; NoRuns  )   
{
//
//Here is some code to capture each image from the camera
//and save them to image.tif
//
inFilePath = @"/Volumes/Portable_Mac/Programming/CameraData/image.tif";
    [TestImage initWithContentsOfFile:inFilePath];      
[viewWindow setImage: TestImage];
    printf("run number:%dn",NoRuns);
}
  

Ответ №1:

Чертеж не сбрасывается в другой поток, но он откладывается. При вызове setImage: ивар представления image изменяется, и, скорее всего, также вызывается установщик setNeedsDisplay: . Таким образом представление сигнализирует о том, что его нужно перерисовать. Однако, поскольку рисование является дорогостоящей задачей, оно выполняется только один раз за проход (в частности, в конце) цикла выполнения, чего не происходит до тех пор, пока ваш for цикл не закончится.

Лучшим способом отображения серии изображений почти наверняка был бы повторяющийся таймер ( performSelector:withObject:afterDelay: на это также стоит обратить внимание). Загрузите все ваши изображения в массив, затем запустите таймер:

 [NSTimer scheduledTimerWithTimeInterval:2.5
                                 target:self
                               selector:@selector(changeDisplayedImage:)
                               userInfo:nil
                                repeats:YES];
  

Затем действие вашего таймера изменит изображение вида:

 - (void)changeDisplayedImage:(NSTimer *)tim {
    // currImageIdx is an ivar keeping track of our position
    if( currImageIdx >= [imageArray count] ){
        [tim invalidate];
        return;
    }
    [viewWindow setImage:[imageArray objectAtIndex:currImageIdx]];
    currImageIdx  ;
}
  

Обратите внимание, что за исключением задержки с фактическим рисунком, настройка содержимого вида, вероятно, происходила бы так быстро, что вы бы не увидели изображение. Однако, если вы действительно хотите, чтобы ваш вид отображался немедленно, его отправка display должна сработать (как указано в setNeedsDisplay: описании).

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

1. Спасибо — это очень полезно. Я ценю тщательность вашего ответа. В конечном счете, моя цель — отслеживать изображения по мере их поступления с камеры, настраивая характеристики камеры до тех пор, пока они не будут «оптимизированы», затем сохраните соответствующий файл на диске для последующей обработки.

2. мой фактический код выглядит следующим образом: NSImage * testImage = [[[NSImage alloc] initWithContentsOfFile: inFilePath] авторелиз]; [viewWindow setImage: testImage]; [viewWindow display]; Мне пришлось повторно инициализировать NSImage, а также запросить немедленное отображение NSImageView. Теперь это работает.