当显示新图像时,我如何保持Matlab图形窗口最大化?

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

感谢您的来信,Christian。
1个回答

5

尝试使用'InitialMagnification'参数和'fit'选项值一起使用imshow

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

来自这个MathWorks教程

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

有关'InitialMagnification',请参见imshow文档的此部分。因此,这应该保持您的图形窗口大小不变。

那就解决了失去窗口最大化的问题。


为了在屏幕上以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);

请注意,由于“如果您指定轴位置(使用subplot或axes),imshow会忽略您可能指定的任何初始放大倍数,并默认为'fit'行为”,因此适合由'Parent'指定的轴。

根据您的代码示例,我已经搞定了: ´fpos = get(hFig,'Position');´ ´imgSizeAllDimensions = size(img);´ ´imgSize = [imgSizeAllDimensions(2) imgSizeAllDimensions(1)];´ ´ha = axes('Parent',hFig,'Units','pixels','Position',[axOffset imgSize]);´ ´hImshow = imshow(img,'Parent',ha);´图像大小数据的问题是它以高度、宽度和通道数的方式输出-这在尝试居中图像等操作时会导致一些混淆。但现在一切都很好运行。非常感谢! - ctp
啊...没能很好地格式化那个评论。无论如何,我想感谢你的帮助! - ctp
@ctp 没错!我交换了行和列,还更新了以不使用通道数。我没有注意到,因为我测试的是一个“正方形”和“灰度”图像。唉! - chappjc
关于您编辑后的代码,我有一个小注释: axOffset = (fpos(3:4)-[size(img,2) size(img,1)])/2; 再次感谢! - ctp
@ctp 谢谢,我差点忘记了! - chappjc
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接