2013-10-23 103 views
3

我想使用此代碼保存圖片,但使用代碼保存圖片時,圖片的大小將與手動另存爲不同。Matlab保存圖片

是否有另一種方法可以保存,與使用代碼的手動另存爲方法相同?

我進行了嘗試使用此代碼(數據名稱:ffout2):

imagesc(fftout2); figure(gcf); 
saveas(gcf,[pwdpath '\Image\' ClassName '\',WavClass(WavClassIndex).name '.jpg'], 'jpg'); 

或:

print -djpeg 'FIG1.jpg'; 

兩個代碼導出文件都在1201 X 901,24位(彩色)

但是使用手動另存爲,規模將是561 X 420,24位(顏色)

+3

最好使用'fullfile'命令來定義文件名和路徑而不是'[pwdPath'\ Image'...'。 'fullfile'是操作系統onsensitve,並且使跨平臺移植代碼變得更加容易。 – Shai

回答

4

您的代碼

imagesc(fftout2); 
figure(gcf); 
saveas(gcf,[pwdpath '\Image\' ClassName '\',WavClass(WavClassIndex).name '.jpg'], 'jpg'); 

print -djpeg 'FIG1.jpg'; 

保存MATLAB數字,因爲它呈現在屏幕上用斧頭,刻度標記,標題等

但這個代碼

imwrite(fftout2,'File.jpg'); 

將純圖像數據寫入文件。 兩種方式都是正確的,取決於你的目標是什麼。

EDIT1

由@chappjc答案和他的評論後,我做了一些測試,似乎所有這些方式可以調整,以提供相同的圖像尺寸甚至print功能與適當的DPI設置。檢查這個代碼

img = rand(100,200,3); 
figure;           % size is 560 x 420 pixels 
imagesc(img); 
get(gcf,'Position') 
F = getframe(gcf); 
size(F.cdata) 
[im,map] = frame2im(F); 
if isempty(map) 
    imwrite(im,'SaveAsFig_RGB.png');   % 560 x 420 image 
else 
    imwrite(im,map,'SaveAsFig_WithCMAP.png'); % 
end 
print(gcf, '-djpeg',  'FIG_000.jpg');  % 1200 x 900 image 
print(gcf, '-djpeg','-r70','FIG_070.jpg');  % 560 x 420 image 
print(gcf, '-djpeg','-r72','FIG_072.jpg');  % 576 x 432 image 
print(gcf, '-djpeg','-r96','FIG_096.jpg');  % 768 x 576 image 
get(0,'ScreenPixelsPerInch')     % gives 96 

有趣的是,要得到保存的圖像大小,我不得不把70 DPI(Win7的+ R2001b),這是從屏幕的DPI分辨率(96 dpi)的MATLAB保存在根對象不同(請參閱get(0)

+0

不幸的是,這些選項中沒有一個實際上完成了答案請求,即模擬另存爲菜單輸出大小。 'getframe'命令將爲您提供使用'imwrite'所需的數據,並獲得所需的(真正的屏幕)輸出大小。我在回答中詳細說明了這個過程。 – chappjc

+0

@chappjc同意。但是這個問題對我來說並不明確。有趣的是,1201/561幾乎與901/420相同。這可能通過適當的DPI值解決 – anandr

+0

[這是來自MathWorks員工的舊帖子](http://www.mathworks.com/matlabcentral/newsreader/view_thread/74104#188292)試圖解釋MATLAB如何獲得用於解析的分辨率打印。這是古老而模糊的,但重點是它似乎與系統有關,所以試着猜測這個數字可能是浪費時間。爲什麼'get(0,'ScreenPixelsPerInch')'給出了一個我不知道的數字。但你至少可以設置(0,'ScreenPixelsPerInch',R)'。這就是爲什麼我建議'getframe'爲你處理它。 – chappjc

1

請求具有保存與通過手動「另存爲」菜單保存的文件尺寸相同的文件的代碼。要獲得相同大小的「另存爲」菜單中,你有如果您使用saveasprint使用getframeframe2im命令如下,

F = getframe(gcf); 
[im,map] = frame2im(F); 
if isempty(map) 
    imwrite(im,'SaveAsFig.jpg'); 
else 
    imwrite(im,map,'SaveAsFig.jpg'); 
end 

,你可能會得到不同尺寸的文件。類似地,imwrite(fftout2)只存儲一個文件,該文件具有本機矩陣大小而不是「另存爲」大小。 getframe的操作可確保文件分辨率反映屏幕上的內容。從文檔:

分辨率捕獲的幀

框中圖像的分辨率取決於軸的像素大小時getframe叫的。當getframe命令拍攝屏幕快照時,如果軸的尺寸較小(例如,因爲您已將視圖限制在軸內的某個窗口中),則getframe會捕獲較少的屏幕像素,並且如果捕獲的圖像的分辨率較低放大顯示。

編輯:

爲了獲得與print命令您需要按照this MathWorks guide to figure settings描述指定與-r開關屏幕分辨率同樣的效果。 -r0開關爲您提供默認分辨率,但不一定是「另存爲」分辨率。例如:通過另存爲使用和getframe/frame2im

print -djpeg -r0 'FIG1.jpg' 

分辨率從這裏使用的自動分辨率不同。有趣的是,我試圖找到一個-r,給了我另存爲菜單(和getframe)返回相同的分辨率,但無法找到合適的-r。關閉的是我的1600x1200顯示器的-r87。沒有任何結果與getframe保存的屏幕截圖完全匹配。也許最好只使用getframe,如果你只想得到屏幕上的內容而不必擔心打印分辨率。 DPI is kind of a silly concept anyway除非您正在打印或始終希望在相同尺寸的顯示器上顯示文件。