2013-03-08 9 views
33

Ecco una situazione: Sto creando alcune figure in MATLAB e le salva automaticamente in file. Il problema che per definizione le immagini sono piccole. Un buon modo per risolvere manualmente il problema è creare un'immagine, ingrandirla e salvarla in un file.Ingrandisci automaticamente la figura in Matlab

Così adesso mi manca questo passaggio di massimizzare automaticamente una figura

Qualche suggerimento? Fino ad ora ho trovato solo questo:

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

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

ma nessuno stanno risolvendo il mio problema.

+3

Questo non deve essere contrassegnato come duplicato. La domanda di riferimento si riferisce all'impostazione di una figura in una dimensione specifica, in pixel. Questa domanda (e risposta) imposta una figura alla dimensione massima, senza riferimento al numero di pixel coinvolti. – Pursuit

risposta

55

questo ha funzionato per me:

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

o per cifra attuale:

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

ho usato anche MAXIMIZE funzione FileExchange che utilizza Java. Questa è la vera massimizzazione.

+0

Sto usando MATLAB 2014A, e queste soluzioni non lavoro per me. La figura è massimizzata bene, ma l'aspetto della figura salvati sul file è ancora sotto l'aspetto di default (e le sottotrame può guardare ridicolmente piccola nell'impostazione predefinita). Trovo che l'opzione di impostare 'PaperPosition', evidenziata in [un altro thread MATLAB] (https://www.mathworks.com/matlabcentral/newsreader/view_thread/131297), sia utile per me. L'interfaccia utente della figura non cambierà il suo aspetto ma l'immagine in uscita è di alta qualità! – HuaTham

+0

@HuaTham: puoi anche provare l'esportazione [export_fig] (http://www.mathworks.com/matlabcentral/fileexchange/23629-export-fig) su File Exchange. Salva l'immagine esattamente come la vedi sullo schermo. – yuk

2

si può provare questo:

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

questa soluzione non tiene conto degli elementi in primo piano. Ad esempio, sulla mia macchina Windows, la dimensione dello schermo è maggiore rispetto alla dimensione massima della finestra a causa della barra delle applicazioni. – Shai

20

Per un Massimizza reale (esattamente come fare clic sul pulsante di ingrandimento nell'interfaccia utente di OS X e Windows) Puoi provare la seguente, che definisce un manico Java nascosta

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

Il pause(n) è essenziale in quanto il suddetto raggiunge lo scape Matlab e si trova su un thread Java separato. Impostare n su qualsiasi valore e controllare i risultati. Più veloce è il computer al momento dell'esecuzione, più piccolo può essere n.

"documentazione" completa può essere trovato here

0

Questa è la forma più breve

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

La mente dà più spiegazioni? –

+1

in che modo questa risposta è diversa da [ifryed's] (http://stackoverflow.com/a/20758210/1714410) – Shai

4

As it is proposed by an author above, se si vuole simulare clic sul pulsante "massimizzare" finestre, è possibile utilizzare il codice che segue . La differenza con la risposta citata è che l'uso di "drawnow" invece di "pause" sembra più corretto.

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

La proprietà JavaFrame verrà rimossa in una versione futura. Vedi http://www.mathworks.com/support/contact_us/dev/javaframe.html –

5

Per massimizzare la figura, è possibile simulare la sequenza di tasti si sarebbe effettivamente utilizzare:

  1. ALT - SPAZIO (come indicato here) per accedere al menu della finestra; e quindi
  2. X per massimizzare (questo può variare nel sistema).

Per inviare le chiavi di programmazione, è possibile utilizzare una procedura basata su Java simile a this answer, come segue:

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 

Voilà! Finestra ingrandita!

+0

Grazie! Mi ha aiutato molto! – Karlo

3

imho massimizzare la finestra di figura non è il modo migliore per salvare una figura come immagine con una risoluzione maggiore.

Sono disponibili le proprietà delle figure per printing and saving. Usando queste proprietà puoi salvare i file in qualsiasi risoluzione tu voglia. Per salvare i file è necessario utilizzare print function, perché è possibile impostare un valore dpi. Quindi, in primo luogo impostare le seguenti proprietà figura:

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

e in secondo luogo salvare il file (per esempio) come png con 100dpi ('-r100')

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

Per ottenere un file con 2048x1536px set Width = 2048/100 e Altezza 1536/100 , /100 perché si risparmia con 100dpi. Se cambi il valore dpi devi anche cambiare il divisore con lo stesso valore.

Come si può vedere, non è necessaria alcuna funzione aggiuntiva dallo scambio di file o dalla procedura basata su java. Inoltre puoi scegliere qualsiasi risoluzione desiderata.

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

Come condizione di trasversalità [notato] (https://stackoverflow.com/questions/15286458/automatically-maximize-figure-in-matlab#comment52208701_30704764), il metodo applicato qui si basa su qualcosa che verrà rimosso in una versione futura di Matlab. Questo codice sopprime l'avvertimento di Matlab a riguardo con la riga 'warning ('off', ...'. – TTT