2013-11-14 3 views
2

Я программирую графический интерфейс в Matlab для эксперимента, где участник теста будет просматривать серию изображений, а после каждого изображения отвечать рейтингом изображения.Как увеличить изображение фигуры Matlab при максимальном показе нового изображения?

Я хочу, чтобы окно максимально увеличивалось. Изображение будет отображаться в течение нескольких секунд, а затем удалено, некоторые слайдеры появятся для рейтинга. Затем слайдеры будут скрыты, и появится новое изображение и т. Д.

Что я до сих пор начинаю отлично с помощью окна с максимизированным рисунком, пока я не загружу изображение и не покажу его, используя imshow или image, что приводит к изменению размера окна фигуры и подгонки к изображению, а не к максимальному увеличению. Если я затем снова увеличиваю окно фигуры, это вызывает заметное мерцание из оконного кадра, которое было сначала максимизировано, затем изменено, а затем снова увеличено - мерцание, которое я бы хотел избежать.

Как я могу увеличить окно и отображать изображение со соотношением 1: 1 (не масштабируется или не изменяется в соответствии с максимальным окном)?

Мне известно о PsychToolbox, но у него вроде бы нет команд для создания слайдеров (которые я бы использовал для оценки), и я бы предпочел не делать этого с нуля. Я также заглянул в windowAPI из файлового обмена Matlab, но до сих пор не нашел решения.

Ниже приведен пример того, что я сейчас (с помощью Matlab R2013a на Windows 7 64-разрядная версия):

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

ответ

3

Попробуйте с помощью параметра 'InitialMagnification' с опцией 'fit' значение с imshow:

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

От this MathWorks tutorial:

Вы также можете указать текстовую строку «fit» в качестве начального значения увеличения. В этом случае, imshow масштабирует изображение, чтобы соответствовать текущему размеру окна фигуры

Смотрите также this section of the imshow docs о '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'.

+0

Спасибо за предложение - просто попробовал. Однако это масштабирует изображения. Мне нужно, чтобы изображение отображалось «как есть», от 1 пикселя до 1 точки на экране - не масштабировано. В другом примечании: эффект можно увидеть без использования 'WindowAPI (hFig, 'Position', 'work');' строка из моего примера кода. – ctp

+0

@ user2994048 - Я смог воспроизвести его в конце концов. Что касается масштабов, я вижу проблему, и я думаю, вам нужно будет создать оси соответствующего размера и отобразить их. – chappjc

+0

@ctp - Просто убедитесь, что создание «осей» и отображение в него с помощью параметра «Родительский» предотвращает изменение «imshow» либо фигуры, либо «осей». – chappjc

Смежные вопросы