web-dev-qa-db-fra.com

Comment enregistrer une figure MATLAB au format JPEG en utilisant saveas () sans que l'image ne se décolle mal?

Dans une fonction MATLAB que j'écris, je génère une figure. Le chiffre est affiché lorsque la fonction est exécutée. Je dois enregistrer la figure sous forme d'image JPEG. Pour ce faire, je pourrais faire Fichier-> Enregistrer sous dans la fenêtre de la figure qui affiche la figure. Mais j'aimerais automatiser cela. J'ai essayé de le faire en utilisant la fonction saveas (). Le problème est que l'image résultante est indésirable. Voici les images d'un problème de démonstration pour vous montrer ce que je veux dire:

Image JPEG enregistrée manuellement à l'aide de Fichier-> Enregistrer sous dans la fenêtre de figure MATLAB: manual file save as jpg rendering

JPEG Image enregistrée à l’aide de la fonction saveas () (notez que les graphiques ne sont pas aussi beaux et que les titres se chevauchent): saveas jpg rendering

Voici la fonction MATLAB dans laquelle je génère la figure et l'enregistre au format JPEG à l'aide de 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

Le chiffre affiché lors de l'exécution de JpgSaveIssueDemo () n'est pas maximisé. Donc, je pensais que si je pouvais maximiser en utilisant l'appel de fonction/s dans JpgSaveIssueDemo () avant saveas (), alors l'image JPEG sauvegardée serait bien enregistrée.

Donc, j'ai utilisé ce code avant la ligne saveas () dans JpgSaveIssueDemo () pour maximiser la figure:

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

Ensuite, le chiffre affiché est maximisé. Cependant, le résultat est le même: l’image JPEG apparaît malgré tout de manière indésirable.

Que peut-on faire pour cela?

23
GigaRohan

La boîte de dialogue d’exportation de figures Matlab et la fonction saveas() manquent de nombreuses fonctionnalités souhaitables. En particulier, savas() ne peut pas créer d’image de résolution personnalisée, c’est pourquoi vos résultats semblent médiocres. Pour la création d'images bitmap, je vous recommande vivement d'utiliser la fonction tierce export_fig . En ajoutant le code suivant à votre fonction (y compris l'astuce de maximisation)

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

J'ai créé cette image: (utilisez "show image" ou similaire dans votre navigateur pour obtenir la taille originale)

image created with export_fig

Pour une qualité supérieure, utilisez des résolutions supérieures de 150 voire 300 dpi (pour l’impression). Au lieu de maximiser la fenêtre de figure, il convient, dans la plupart des applications, de définir la taille de l'axe pour obtenir une image de la taille souhaitée:

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
20
Deve

Utilisez simplement un format évolutif sans perte comme EPS, voir la dernière ligne de l'extrait ci-dessous :)

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

Je ne peux cependant pas joindre un fichier EPS ici, non pris en charge, mais il est évolutif et peut être inséré dans des processeurs de traitement de texte ou Latex sans craindre une mauvaise résolution.

4
Karibe

J'ai eu le même problème, et voici ce que j'ai utilisé pour le résoudre:

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

gcf peut être remplacé par la poignée de la figure désirée.

1
NoamG