web-dev-qa-db-ja.com

画像がひどくはがれることなく、saveas()を使用してMATLAB FigureをJPEGとして保存する方法は?

私が書いているMATLAB関数では、図を生成しています。関数が実行されると、図が表示されます。 FigureをJPEG画像として保存する必要があります。これを行うには、図を表示する図ウィンドウで[ファイル]-> [名前を付けて保存]を実行します。しかし、私はこれを自動化したいです。私はsaveas()関数を使用してそれをやろうとしました。問題は、結果の画像が望ましくないことです。デモ問題の画像を次に示します。

MATLAB FigureウィンドウでFile-> Save Asを使用して手動で保存されたJPEGイメージ:manual file save as jpg rendering

saveas()関数を使用して保存されたJPEG画像(プロットがニースではなく、タイトルが重なっていることに注意してください):saveas jpg rendering

以下は、関数saveas()を使用してFigureを生成し、JPEGとして保存するMATLAB関数です。

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()の実行時に表示される図は最大化されていません。ですから、JpgSaveIssueDemo()で関数呼び出しを使用して最大化できればbefore saveas()が実行されると、保存されたJPEG画像がうまく出てくると思いました。

そこで、図を最大化するために、JpgSaveIssueDemo()のsaveas()行の前にこのコードを使用しました。

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

次に、表示される図が最大化されます。ただし、結果は同じです。JPEG画像は依然として望ましくなく出力されます。

これのために何ができますか?

23
GigaRohan

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(印刷用)の高解像度を使用します。 Figureウィンドウを最大化する代わりに、ほとんどのアプリケーションでは、軸サイズを定義して目的のサイズの画像を取得するのが適切です。

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

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ファイルをここに添付することはできませんが、スケーラブルであり、解像度の低下を心配せずにワードプロセッサまたはラテックスに配置できます。

4
Karibe

私は同じ問題を抱えていました、そして、ここに私がそれを解決するために使用したものがあります:

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

gcfは、目的の図のハンドルに置き換えることができます。

1
NoamG