3

テスト参加者が一連の画像を表示し、各画像の後に画像の評価で応答する実験のために、Matlab で GUI をプログラミングしています。

ウィンドウを常に最大化しておきたい。画像が数秒間表示されてから削除され、評価用のスライダーがいくつか表示されます。次に、スライダーが非表示になり、新しい画像が表示されます...

私がこれまでに得たものは、最大化されたままではなく、imshow または image コマンドを使用して画像を読み込んで表示するまで、最大化された Figure ウィンドウで問題なく開始されます。次に Figure ウィンドウを再度最大化すると、最初に最大化され、次にサイズ変更され、再度最大化されたウィンドウ フレームから顕著なちらつきが発生します - 私が避けたいちらつき。

ウィンドウを最大化したまま、画像を 1:1 の比率で表示するにはどうすればよいですか (最大化されたウィンドウに合わせて拡大縮小またはサイズ変更されません)。

PsychToolbox のことは知っていますが、スライダーを作成するためのコマンド (評価に使用するコマンド) がないようです。Matlab File Exchange の 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 は Figure ウィンドウの現在のサイズに合わせてイメージをスケーリングします。

に関するドキュメントのこのセクションimshowも参照してください'InitialMagnification'。したがって、Figure ウィンドウを同じサイズに保つ必要があります。

これにより、ウィンドウの最大化が失われるという問題が解決されます。


画面上で 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 に答える