3

我正在 Matlab 中为一个实验编写一个 GUI,在该实验中,测试参与者将查看一系列图像,并在每张图像之后,对图像进行评分。

我想始终保持窗口最大化。图像将显示几秒钟,然后删除,将出现一些用于评级的滑块。接下来,将隐藏滑块,并出现一个新图像,等等......

到目前为止,我已经开始使用最大化的图形窗口,直到我加载图像并使用 imshow 或 image 命令显示它,这会导致图形窗口调整大小并适合图像,而不是保持最大化。如果我然后再次最大化图形窗口,它会导致窗口框架明显闪烁,首先被最大化,然后调整大小,然后再次最大化 - 我想避免这种闪烁。

如何保持窗口最大化,并以 1:1 的比例显示图像(不缩放或调整大小以适应最大化的窗口)?

我知道 PsychToolbox,但它似乎没有用于创建滑块的命令(我将用于评分),我不想从头开始做这些。我还从 Matlab 文件交换中查看了 windowAPI,但仍然没有找到解决方案。

以下是我现在拥有的示例(在 Windows 7 64 位上使用 Matlab R2013a):

screenSize = get(0,'screensize');
screenWidth = screenSize(3);
screenHeight = screenSize(4);

% Create figure window, keeping it invisible while adding UI controls, etc.
hFig = figure('Name','APP',...
    'Numbertitle','off',...
    'Position', [0 0 screenWidth screenHeight],...
    'WindowStyle','modal',...
    'Color',[0.5 0.5 0.5],...
    'Toolbar','none',...
    'Visible','off');

% Make the figure window visible
set(hFig,'Visible','on');

% Maximize the figure window, using WindowAPI
WindowAPI(hFig, 'Position', 'work');

% Pause (in the full version of this script, this would instead be
% a part where some UI elements are shown and later hidden...
pause(1.0);

% Read image file
img = imread('someImage.png');

% Create handle for imshow, and hiding the image for now.
% This is where Matlab decides to modify the figure window,
% so it fits the image rather than staying maximized.
hImshow = imshow(img);
set(hImshow,'Visible','off');

% Show the image
set(hImshow,'Visible','on');

谢谢,克里斯蒂安

4

1 回答 1

5

尝试使用'InitialMagnification'带有'fit'选项值的参数imshow

hImshow = imshow(img,'InitialMagnification','fit')

这个 MathWorks 教程

您还可以将文本字符串“fit”指定为初始放大率值。在这种情况下,imshow 会缩放图像以适应图形窗口的当前大小

imshow参阅有关'InitialMagnification'. 因此,这应该使您的图形窗口保持相同的大小。

这将解决失去窗口最大化的问题。


要在屏幕上以 1 个像素到 1 个点的比例显示图像,您可以为图像创建一个正确大小的轴,并显示到该轴:

fpos = get(hFig,'Position')
axOffset = (fpos(3:4)-[size(img,2) size(img,1)])/2;
ha = axes('Parent',hFig,'Units','pixels',...
          'Position',[axOffset size(img,2) size(img,1)]);
hImshow = imshow(img,'Parent',ha);

请注意,没有必要指定放大倍数,因为“如果您指定坐标轴位置(使用子图或坐标轴),imshow则忽略您可能指定的任何初始放大倍数并默认为'fit'行为”,因此适合'Parent'.

于 2013-11-14T22:29:34.980 回答