2013-03-08 3 views
33

В этой ситуации: Я создаю несколько фигур в Matlab и автоматически сохраняю их в файлах. Проблема в том, что по определению изображения малы. Хороший способ сделать мою проблему руками - создать изображение, увеличить его и сохранить в файл.Автоматическая максимизация фигуры в Matlab

Так что сейчас я пропускаю этот шаг автоматически увеличить фигуру

Любые предложения? До сих пор я нашел только это:

http://answers.yahoo.com/question/index?qid=20071127135551AAR5JYh

http://www.mathworks.com/matlabcentral/newsreader/view_thread/238699

, но ни один не решить мою проблему.

+3

Это не должно быть помечено как дублирующее. Вопрос о ссылках относится к установке фигуры в определенный размер в пикселях. Этот вопрос (и ответ) устанавливает цифру в максимальный размер без ссылки на количество задействованных пикселей. – Pursuit

ответ

55

Это работает для меня:

figure('units','normalized','outerposition',[0 0 1 1]) 

или для текущей фигуры:

set(gcf,'units','normalized','outerposition',[0 0 1 1]) 

Я также использовал MAXIMIZE функцию на FileExchange, которая использует Java. Это истинная максимизация.

+0

Я использую MATLAB 2014a, и эти решения не работают для меня. Рисунок максимизируется в порядке, но аспект фигуры, сохраненный в файле, по-прежнему находится в аспекте по умолчанию (и подсети могут выглядеть смехотворно малыми по умолчанию). Я могу найти параметр «PaperPosition», указанный в [другой теме MATLAB] (https://www.mathworks.com/matlabcentral/newsreader/view_thread/131297), чтобы помочь мне. Фигура UI не изменит свой аспект, но выходное изображение будет в высоком качестве! – HuaTham

+0

@HuaTham: Вы также можете попробовать [export_fig] (http://www.mathworks.com/matlabcentral/fileexchange/23629-export-fig) отправить на Файловый обмен. Он сохраняет изображение точно так же, как вы видите его на экране. – yuk

2

вы можете попробовать это:

screen_size = get(0, 'ScreenSize'); 
f1 = figure(1); 
set(f1, 'Position', [0 0 screen_size(3) screen_size(4) ]); 
+0

это решение не учитывает элементы переднего плана. Например, на моей машине Windows размер экрана больше, чем максимальный размер окна из-за панели задач. – Shai

20

Для фактического максимального увеличения (так же, как нажав на кнопку разворачивания в пользовательском интерфейсе OS X и Windows) Вы можете попробовать следующее, который вызывает скрытую Java ручку

figure; 
pause(0.00001); 
frame_h = get(handle(gcf),'JavaFrame'); 
set(frame_h,'Maximized',1); 

pause(n) Необходимо, так как вышеизложенное выходит из области Matlab и находится на отдельной ветке Java. Установите n на любое значение и проверьте результаты. Чем быстрее компьютер находится во время выполнения, тем меньше может быть n.

Full «документация» можно найти here

0

Это самая короткая форма

figure('Position',get(0,'ScreenSize')) 
+2

Ум дает больше объяснений? –

+1

, каким образом этот ответ отличается от того, что [ifryed's] (http://stackoverflow.com/a/20758210/1714410) – Shai

4

As it is proposed by an author above, если вы хотите, чтобы имитировать нажатия на кнопку «максимизируют» окна, вы можете использовать код, который следует , Разница с упоминаемым ответом заключается в том, что использование «drawow» вместо «pause» кажется более правильным.

figure; 
% do your job here 
drawnow; 
set(get(handle(gcf),'JavaFrame'),'Maximized',1); 
+4

Свойство JavaFrame будет удалено в будущей версии. См. Http://www.mathworks.com/support/contact_us/dev/javaframe.html –

5

Чтобы увеличить рисунок, вы можете имитировать последовательность клавиш вы на самом деле использовать:

  1. ALT - ПРОСТРАНСТВО (как указано here) для доступа к меню окна; а затем
  2. X для максимальной (в вашей системе это может быть значение).

Для передачи ключей в программе, вы можете использовать процедуру Java на основе, аналогичной this answer следующим образом:

h = figure;           %// create figure and get handle 
plot(1:10);           %// do stuff with your figure 
figure(h)           %// make it the current figure 
robot = java.awt.Robot; 
robot.keyPress(java.awt.event.KeyEvent.VK_ALT);  %// send ALT 
robot.keyPress(java.awt.event.KeyEvent.VK_SPACE); %// send SPACE 
robot.keyRelease(java.awt.event.KeyEvent.VK_SPACE); %// release SPACE 
robot.keyRelease(java.awt.event.KeyEvent.VK_ALT); %// release ALT 
robot.keyPress(java.awt.event.KeyEvent.VK_X);  %// send X 
robot.keyRelease(java.awt.event.KeyEvent.VK_X);  %// release X 

вуаля! Окно максимально!

+0

Спасибо! Помог мне много! – Karlo

3

imho максимизация окна фигуры - не лучший способ сохранить фигуру как изображение в более высоком разрешении.

Свойства фигуры для printing and saving. Используя эти свойства, вы можете сохранять файлы в любом требуемом разрешении. Чтобы сохранить файлы, вы должны использовать print function, потому что вы можете установить значение dpi. Таким образом, во-первых, установить следующие свойства фигуры:

set(FigureHandle, ... 
    'PaperPositionMode', 'manual', ... 
    'PaperUnits', 'inches', ... 
    'PaperPosition', [0 0 Width Height]) 

и во-вторых, сохранить файл (например), как детские с 100dpi ('-r100')

print(FigureHandle, Filename, '-dpng', '-r100'); 

Чтобы получить файл с 2048x1536px установить Width = 2048/100 и Height 1536/100 , /100, потому что вы экономите 100 dpi. Если вы измените значение dpi, вам также нужно будет изменить делитель на одно и то же значение.

Как вы можете видеть, нет необходимости в какой-либо дополнительной функции из обмена файлами или на основе java-процедуры. Кроме того, вы можете выбрать любое требуемое разрешение.

0
%% maximizeFigure 
% 
% Maximizes the current figure or creates a new figure. maximizeFigure() simply maximizes the 
% current or a specific figure 
% |h = maximizeFigure();| can be directly used instead of |h = figure();| 
% 
% *Examples* 
% 
% * |maximizeFigure(); % maximizes the current figure or creates a new figure| 
% * |maximizeFigure('all'); % maximizes all opened figures| 
% * |maximizeFigure(hf); % maximizes the figure with the handle hf| 
% * |maximizeFigure('new', 'Name', 'My newly created figure', 'Color', [.3 .3 .3]);| 
% * |hf = maximizeFigure(...); % returns the (i.e. new) figure handle as an output| 
% 
% *Acknowledgements* 
% 
% * Big thanks goes out to Yair Altman from http://www.undocumentedmatlab.com/ 
% 
% *See Also* 
% 
% * |figure()| 
% * |gcf()| 
% 
% *Authors* 
% 
% * Daniel Kellner, medPhoton GmbH, Salzburg, Austria, 2015-2017 
%% 

function varargout = maximizeFigure(varargin) 

warning('off', 'MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame') 

% Check input variables 
if isempty(varargin) 
    hf = gcf; % use current figure 
elseif strcmp(varargin{1}, 'new') 
    hf = figure(varargin{2:end}); 
elseif strcmp(varargin{1}, 'all') 
    hf = findobj('Type', 'figure'); 
elseif ~isa(varargin{1}, 'char') && ishandle(varargin{1}) &&... 
     strcmp(get(varargin{1}, 'Type'), 'figure') 
    hf = varargin{1}; 
else 
    error('maximizeFigure:InvalidHandle', 'Failed to find a valid figure handle!') 
end 

for cHandle = 1:length(hf) 
    % Skip invalid handles and plotbrowser handles 
    if ~ishandle(cHandle) || strcmp(get(hf, 'WindowStyle'), 'docked') 
     continue 
    end 

    % Carry the current resize property and set (temporarily) to 'on' 
    oldResizeStatus = get(hf(cHandle), 'Resize'); 
    set(hf(cHandle), 'Resize', 'on'); 

    % Usage of the undocumented 'JavaFrame' property as described at: 
    % http://undocumentedmatlab.com/blog/minimize-maximize-figure-window/ 
    jFrame = get(handle(hf(cHandle)), 'JavaFrame'); 

    % Due to an Event Dispatch thread, the pause is neccessary as described at: 
    % http://undocumentedmatlab.com/blog/matlab-and-the-event-dispatch-thread-edt/ 
    pause(0.05) 

    % Don't maximize if the window is docked (e.g. for plottools) 
    if strcmp(get(cHandle, 'WindowStyle'), 'docked') 
     continue 
    end 

    % Don't maximize if the figure is already maximized 
    if jFrame.isMaximized 
     continue 
    end 

    % Unfortunately, if it is invisible, it can't be maximized with the java framework, because a 
    % null pointer exception is raised (java.lang.NullPointerException). Instead, we maximize it the 
    % straight way so that we do not end up in small sized plot exports. 
    if strcmp(get(hf, 'Visible'), 'off') 
     set(hf, 'Units', 'normalized', 'OuterPosition', [0 0 1 1]) 
     continue 
    end 

    jFrame.setMaximized(true); 

    % If 'Resize' will be reactivated, MATLAB moves the figure slightly over the screen borders. 
    if strcmp(oldResizeStatus, 'off') 
     pause(0.05) 
     set(hf, 'Resize', oldResizeStatus) 
    end 
end 

if nargout 
    varargout{1} = hf; 
end 
+0

Как условие трансверсальности [отмечено] (https://stackoverflow.com/questions/15286458/automatic-maximize-figure-in-matlab#comment52208701_30704764), применяемый здесь метод полагается на то, что будет удалено в будущей версии Matlab. Этот код подавляет предупреждение Matlab об этом с помощью строки предупреждения ('off', ... '. – TTT