Matlab保存图片

时间:2013-10-23 06:17:24

标签: 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位(彩色)

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

您请求的代码可以保存与通过手动“另存为”菜单保存的文件尺寸相同的文件。要获得与“另存为”菜单相同的大小,您必须使用getframeframe2im命令,如下所示,

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

如果您使用saveasprint,则可能会获得具有不同尺寸的文件。同样适用于imwrite(fftout2),它存储的文件具有原生矩阵大小而不是“另存为”大小。 getframe的操作可确保文件分辨率反映您在屏幕上显示的内容。来自文档:

  

捕获帧的分辨率

     

框架图像的分辨率取决于调用getframe时轴的大小(以像素为单位)。由于getframe命令获取屏幕的快照,如果轴的大小很小(例如,因为您已将视图限制在轴内的窗口),getframe捕获的屏幕像素更少,并且如果放大显示,捕获的图像可能分辨率较差。

修改

要使用print命令获得相同的效果,您需要使用-r开关指定屏幕分辨率,如this MathWorks guide to figure settings中所述。 -r0开关为您提供默认分辨率,但不一定是“另存为”为您提供的分辨率。例如:

print -djpeg -r0 'FIG1.jpg'

“另存为”和getframe / frame2im使用的分辨率与此处使用的自动分辨率不同。有趣的是,我试图找到一个-r,它给了我与另存为菜单(和getframe)返回的相同分辨率,但无法找到合适的-r。我的1600x1200显示器的关闭是-r87。没有任何内容与getframe保存的屏幕抓取完全匹配。如果您只想获取屏幕上的内容而不必担心打印分辨率,也许最好只使用getframeDPI is kind of a silly concept anyway除非您正在打印或总是希望在相同大小的显示器上显示该文件。