Как сохранить фигуру MATLAB в формате JPEG с помощью saveas() без плохого изображения?

В MATLAB-функции я пишу, я генерирую цифру. Эта цифра отображается, когда функция выполняется. Мне нужно сохранить фигуру как изображение в формате JPEG. Для этого я мог бы сделать File- > Save As в окне рисунка, в котором отображается рисунок. Но я бы хотел автоматизировать это. Я попытался сделать это, используя функцию saveas(). Проблема в том, что результирующее изображение нежелательно. Вот изображения для демонстрационной проблемы, чтобы показать вам, что я имею в виду:

JPEG-изображение сохранено вручную с помощью File- > Save As в окне фигуры MATLAB:

JPEG-изображение, сохраненное с помощью функции saveas() (обратите внимание, что графики не так хороши, а заголовки перекрываются):

Вот функция MATLAB, в которой я создаю фигуру и сохраняю фигуру как JPEG, используя saveas():

function JpgSaveIssueDemo( )
    figure( 1 );
    t = 0:0.1:8;    

    subplot( 2, 2, 1 );    
    plot( t, sin(t) );
    title( 'Plot 1 of Example to Demonstrate JPG Save Issue', 'FontSize', 18 );

    subplot( 2, 2, 2 );
    plot( t, sin(t) );
    title( 'Plot 2 of Example to Demonstrate JPG Save Issue', 'FontSize', 18 );

    subplot( 2, 2, 3 );
    plot( t, sin(t) );
    title( 'Plot 3 of Example to Demonstrate JPG Save Issue', 'FontSize', 18 );

    subplot( 2, 2, 4 );
    plot( t, sin(t) );
    title( 'Plot 4 of Example to Demonstrate JPG Save Issue', 'FontSize', 18 );

    saveas( gcf, 'DemoPlot', 'jpg' );
end

Показатель, отображаемый при выполнении JpgSaveIssueDemo(), не максимизируется. Итак, я подумал, что если бы я мог максимизировать его с помощью вызова функции /s в JpgSaveIssueDemo() до выполнения функции saveas(), то сохраненное изображение JPEG получилось бы хорошо.

Итак, я использовал этот код перед строкой saveas() в JpgSaveIssueDemo(), чтобы максимизировать цифру:

drawnow;
jFrame = get(handle(gcf),'JavaFrame'); 
jFrame.setMaximized(true);

Затем отображаемая фигура максимизируется. Однако результат тот же: изображение JPEG по-прежнему выходит нежелательно.

Что можно сделать для этого?

Ответ 1

Диалоговое окно экспорта фигуры Matlab и функция saveas() не имеют много желаемых функций. Особенно, savas() не может создать пользовательское изображение resoultion, поэтому ваши результаты выглядят плохо. Для создания растровых изображений я настоятельно рекомендую использовать стороннюю функцию export_fig. Добавив следующий код к вашей функции (включая максимизирующий трюк)

set(gcf, 'Color', 'white'); % white bckgr
export_fig( gcf, ...      % figure handle
    'Export_fig_demo',... % name of output file without extension
    '-painters', ...      % renderer
    '-jpg', ...           % file format
    '-r72' );             % resolution in dpi

Я создал это изображение: (используйте "показать изображение" или подобное в вашем браузере, чтобы получить исходный размер)

image created with export_fig

Для более высокого качества используйте более высокое разрешение 150 или даже 300 dpi (для печати). Вместо максимизации окна рисунка для большинства приложений целесообразно определить размер оси для получения изображения требуемого размера:

unitSave = get(figureHandle, 'Unit');                % store original unit
set(figureHandle, 'Unit', 'centimeters');            % set unit to cm
set(figureHandle,'position',[0 0 width height]);     % set size
set(figureHandle, 'Unit', unitSave);                 % restore original unit

Ответ 2

Просто используйте масштабируемый формат без потерь, например EPS, см. последнюю строку в фрагменте ниже:)

h1=figure % create figure
plot(t,Data,'r');
legend('Myfunction');

% Create title with required font size
title({'Variance vs distance'},'LineWidth',4,'FontSize',18,...
'FontName','Droid Sans');

% Create xlabel with required font size
xlabel({'Distance (cm)'},'FontSize',14,...
'FontName','DejaVu Sans');

% Create ylabel with required font size
ylabel({'Variance of sobel gradients'},'FontSize',14,...
'FontName','DejaVu Sans');

print(h1,'-depsc','autofocus.eps') % print figure to a file

Я не могу прикрепить файл EPS здесь, хотя и не поддерживаемый, но его масштабируемый и может быть помещен в текстовые процессоры или латекс, не беспокоясь о плохом разрешении.

Ответ 3

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

set(gcf,'PaperPositionMode','auto') saveas(gcf,'file_to_save','png')

где gcf можно заменить дескриптором на нужную цифру.