Автоматически максимизировать фигуру

35

Я создаю некоторые фигуры в MATLAB и автоматически сохраняю их в файлы. Проблема в том, что по определению изображения маленькие. Хороший способ решить мою проблему вручную - создать изображение (рисунок), развернуть его и сохранить в файл.

Я пропускаю этот шаг автоматического увеличения фигуры.

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

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

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

но никто не решает мою проблему.

  • 3
    Это не должно быть отмечено как дубликат. Вопрос о ссылках относится к заданию фигуры определенного размера в пикселях. Этот вопрос (и ответ) устанавливает максимальный размер фигуры без учета количества задействованных пикселей.
Теги:
matlab-figure
export
figure
maximize-window

9 ответов

60
Лучший ответ

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

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 , будет для меня полезной. Пользовательский интерфейс рисунка не изменит свой внешний вид, но полученное изображение будет высокого качества!
  • 0
    @HuaTham: Вы также можете попробовать отправку export_fig в File Exchange. Это сохраняет изображение в точности так, как вы видите его на экране.
20

Для фактического Maximize (точно так же, как нажатие кнопки максимизации в пользовательском интерфейсе 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 может быть.

Здесь можно найти полную "документацию"

6

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

  • ALT - SPACE (как указано здесь) для доступа к меню окна; и затем
  • X, чтобы максимизировать (это может различаться в вашей системе).

Чтобы программно отправить ключи, вы можете использовать процедуру на основе Java, похожую на этот ответ, следующим образом:

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
    Спасибо! Мне очень помогли!
5

Начиная с R2018a объекты figure и uifigure содержат свойство с именем WindowState. По умолчанию это значение установлено как 'normal', но его значение 'maximized' дает желаемый результат.

В заключение:

hFig.WindowState = 'maximized'; % Requires R2018a

Кстати, для решения вашей первоначальной проблемы - если вы хотите экспортировать содержимое рисунков в изображения, не беспокоясь о слишком малых результатах - я очень рекомендую утилиту export_fig.

  • 0
    Кроме того, вы можете установить его по умолчанию, прежде чем set(groot, 'defaultFigureWindowState', 'maximized'); что-либо, set(groot, 'defaultFigureWindowState', 'maximized');
  • 0
    Или установите его для всех открытых фигур set( get(groot, 'Children'), 'WindowState', 'maximized');
Показать ещё 1 комментарий
4

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

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

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

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

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

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

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

4

Как предлагается автором выше, если вы хотите имитировать нажатие кнопки "максимизировать" окна, вы можете использовать следующего кода. Разница с упоминаемым ответом заключается в том, что использование "drawow" вместо "pause" выглядит более правильным.

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

вы можете попробовать следующее:

screen_size = get(0, 'ScreenSize');
f1 = figure(1);
set(f1, 'Position', [0 0 screen_size(3) screen_size(4) ] );
  • 0
    это решение не учитывает элементы переднего плана. Например, на моем компьютере с Windows размер экрана больше, чем максимальный размер окна из-за панели задач.
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
    Как отмечалось условие трансверсальности, применяемый здесь метод опирается на то, что будет удалено в будущем выпуске Matlab. Этот код подавляет предупреждение Matlab об этом с помощью warning('off',... line.
0

Это кратчайшая форма

figure('Position',get(0,'ScreenSize'))
  • 2
    Не могли бы вы дать больше объяснений?
  • 1
    в чем отличие этого ответа от ifryed?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню