2013-03-08 38 views
33

Đây là một tình huống: Tôi đang tạo một số số liệu trong MATLAB và tự động lưu chúng vào tệp. Vấn đề mà theo định nghĩa hình ảnh là nhỏ. Một cách tốt để làm vấn đề của tôi bằng tay là tạo ra một hình ảnh, tối đa hóa nó và lưu vào một tập tin.Tự động tối đa hóa hình trong Matlab

Vì vậy, ngay bây giờ tôi đang thiếu bước này để tự động tối đa hóa hình ảnh

Bất kỳ đề xuất nào? Cho đến bây giờ tôi chỉ thấy điều này:

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

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

nhưng không ai đang giải quyết vấn đề của tôi.

+3

Điều này không được đánh dấu là trùng lặp. Câu hỏi tham chiếu đề cập đến việc thiết lập một hình thành một kích thước cụ thể, tính bằng pixel. Câu hỏi này (và câu trả lời) thiết lập một con số với kích thước tối đa, mà không tham chiếu đến số lượng pixel liên quan. – Pursuit

Trả lời

55

này đã làm việc cho tôi:

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

hoặc cho con số hiện tại:

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

Tôi cũng đã sử dụng chức năng MAXIMIZE trên FileExchange có sử dụng java. Đây là sự tối đa hóa thực sự.

+0

Tôi đang sử dụng MATLAB 2014a và các giải pháp này không hiệu quả đối với tôi. Con số này được tối đa hóa hoàn toàn, nhưng khía cạnh của hình được lưu vào tập tin vẫn còn ở khía cạnh mặc định (và các subplots có thể trông nhỏ một cách ridiculously trong thiết lập mặc định). Tôi tìm thấy tùy chọn thiết lập 'PaperPosition', được chỉ ra trong [một chủ đề MATLAB] (https://www.mathworks.com/matlabcentral/newsreader/view_thread/131297), để giúp ích cho tôi. Giao diện người dùng hình sẽ không thay đổi khía cạnh của nó nhưng hình ảnh đầu ra có chất lượng cao! – HuaTham

+0

@HuaTham: Bạn cũng có thể dùng thử [export_fig] (http://www.mathworks.com/matlabcentral/fileexchange/23629-export-fig) trên File Exchange. Nó lưu hình ảnh chính xác như bạn thấy trên màn hình. – yuk

2

bạn có thể thử này:

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

giải pháp này không tính đến các yếu tố tiền cảnh. Ví dụ, trên máy cửa sổ của tôi, kích thước màn hình lớn hơn kích thước tối đa của cửa sổ do thanh tác vụ. – Shai

20

Đối với một Tối đa hóa thực tế (giống hệt như cách nhấn vào nút maximize ở phần giao diện người dùng của OS X và Windows) Bạn có thể thử những điều sau đây mà gọi là xử lý Java ẩn

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

pause(n) là điều cần thiết khi ở trên đạt đến hình dạng Matlab scape và nằm trên một chuỗi Java riêng biệt. Đặt n thành bất kỳ giá trị nào và kiểm tra kết quả. Máy tính càng nhanh thì thời gian thực hiện càng nhỏ thì có thể là n.

Full "tài liệu" có thể được tìm thấy here

0

Đây là dạng ngắn

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

Tâm giải thích thêm? –

+1

theo cách nào khác là câu trả lời này khác nhau mà [ifryed's] (http://stackoverflow.com/a/20758210/1714410) – Shai

4

As it is proposed by an author above, nếu bạn muốn để mô phỏng cách nhấn vào nút "tối đa hóa" cửa sổ, bạn có thể sử dụng mã mà sau . Sự khác biệt với câu trả lời được đề cập là sử dụng "rút thăm" thay vì "tạm dừng" có vẻ chính xác hơn.

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

Thuộc tính JavaFrame sẽ bị xóa trong bản phát hành trong tương lai. Xem http://www.mathworks.com/support/contact_us/dev/javaframe.html –

5

Để tối đa hóa hình, bạn có thể bắt chước các chuỗi các phím bạn thực sự sẽ sử dụng:

  1. ALT - SPACE (như đã nêu here) để truy cập vào menu cửa sổ; và sau đó
  2. X để tối đa hóa (điều này có thể khác trong hệ thống của bạn).

Để gửi các phím lập trình, bạn có thể sử dụng một thủ tục dựa trên nền Java tương tự như this answer, như sau:

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 

Voila! Đã phóng to cửa sổ!

+0

Cảm ơn! Giúp tôi rất nhiều! – Karlo

3

Imho tối đa hóa cửa sổ hình không phải là cách tốt nhất để lưu hình ảnh dưới dạng hình ảnh ở độ phân giải cao hơn.

Có các thuộc tính hình cho printing and saving. Sử dụng các thuộc tính này, bạn có thể lưu tệp ở bất kỳ độ phân giải nào bạn muốn. Để lưu các tệp bạn phải sử dụng print function, vì bạn có thể đặt giá trị dpi. Vì vậy, trước hết là thiết lập các thuộc tính hình sau:

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

và thứ hai lưu các tập tin (ví dụ) như png với 100dpi ('-r100')

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

Để có được một tập tin với 2048x1536px thiết Width = 2048/100 và Height 1536/100 , /100 vì bạn tiết kiệm 100dpi. Nếu bạn thay đổi giá trị dpi, bạn cũng phải thay đổi số chia thành cùng một giá trị.

Như bạn có thể thấy không cần thêm bất kỳ chức năng nào từ trao đổi tệp hoặc thủ tục dựa trên java. Ngoài ra, bạn có thể chọn bất kỳ độ phân giải mong muốn nào.

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

Là điều kiện chuyển đổi [ghi chú] (https://stackoverflow.com/questions/15286458/automatically-maximize-figure-in-matlab#comment52208701_30704764), phương pháp được áp dụng ở đây dựa vào thứ gì đó sẽ bị xóa trong bản phát hành tương lai của Matlab. Mã này ngăn chặn cảnh báo của Matlab về điều này với dòng 'warning ('off', ...'. – TTT

Các vấn đề liên quan