【问题标题】:displaying multiple images serially within a loop在一个循环中连续显示多个图像
【发布时间】:2011-04-26 17:27:46
【问题描述】:

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

谢谢 微波

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);
}

【问题讨论】:

    标签: objective-c image


    【解决方案1】:

    绘图不会转储到另一个线程,但会延迟。当您调用setImage: 时,视图的image ivar 会发生变化,并且很可能setter 也调用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: 描述中所述)。

    【讨论】:

    • 谢谢 - 这非常有用。我很欣赏你的回答的彻底性。最终,我的目标是监控来自相机的图像,设置相机特性直到它们被“优化”,然后将适当的文件保存到磁盘以供以后处理。
    • 我的实际代码是这样的: NSImage *TestImage = [[[NSImage alloc] initWithContentsOfFile:inFilePath] autorelease]; [viewWindow setImage:TestImage]; [视图窗口显示];我不得不重新初始化 NSImage 并要求 NSImageView 立即显示。现在可以了。
    猜你喜欢
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 2021-10-12
    • 2019-09-07
    • 1970-01-01
    相关资源
    最近更新 更多