我想使用此代码保存图片,但在使用代码保存图片时,图片的大小将因手动“另存为”而不同。
是否有另一种保存方法,与使用代码的手动“另存为”方法相同?
我试过这段代码(数据名称: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位(彩色)
答案 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)
您请求的代码可以保存与通过手动“另存为”菜单保存的文件尺寸相同的文件。要获得与“另存为”菜单相同的大小,您必须使用getframe
和frame2im
命令,如下所示,
F = getframe(gcf);
[im,map] = frame2im(F);
if isempty(map)
imwrite(im,'SaveAsFig.jpg');
else
imwrite(im,map,'SaveAsFig.jpg');
end
如果您使用saveas
或print
,则可能会获得具有不同尺寸的文件。同样适用于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
保存的屏幕抓取完全匹配。如果您只想获取屏幕上的内容而不必担心打印分辨率,也许最好只使用getframe
。 DPI is kind of a silly concept anyway除非您正在打印或总是希望在相同大小的显示器上显示该文件。