在循环内连续显示多个图像

时间:2011-04-26 17:27:47

标签: objective-c image

我想在循环中获得流式显示。我的理解是,原则上我可以通过放置与按钮推动相关联的无限循环来挂起程序。在任何情况下,当我运行此代码时,运行计数器打印出来就好了,并且捕获了来自摄像机的帧(我可以将它们保存为一系列文件。)但是,使用setImage的显示无需做任何事情直到结束循环时,它显示屏幕上的最后一个图像。我的问题是: 如果程序按照文档中的描述顺序运行,为什么不显示显示,而display命令另一端的代码处理得很好?显示器是否只是“转储”到一个并行进程中,在这种情况下我应该放一个等待显示完成的延迟循环?

由于 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:%d\n",NoRuns);
}

1 个答案:

答案 0 :(得分:2)

绘图不会转储到另一个线程,但会延迟。当您致电setImage:时,视图image ivar会发生变化,很可能设置者也会调用setNeedsDisplay:。这就是视图需要重绘的信号。但是,因为绘图是一件昂贵的事情,它只能运行循环gets done once per pass(特别是在末尾),直到你的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:说明中所述)。

相关问题